SQL实战

根据查询结果来更新

  1. -- 失效用户excel表导入到表中,根据失效用户账号去更新正式的表
  2. SELECT * from sys_user su INNER JOIN tst_sys_user tsu on su.USER_NAME = tsu.从账号 WHERE su.STATUS <> 'EXPR'
  3. UPDATE sys_user su
  4. INNER JOIN ( SELECT su.USER_NAME un FROM sys_user su INNER JOIN tst_sys_user tsu ON su.USER_NAME = tsu.从账号 ) su2 ON su.USER_NAME = su2.un
  5. SET su.STATUS = 'EXPR',
  6. su.attribute12 = "注销-此账号从此不可恢复"

统计最新月份已确认的报表的数量

  1. SELECT
  2. mfpa.period,
  3. COUNT( DISTINCT mfpa.type ) count
  4. FROM
  5. moa_fin_publish_archive mfpa
  6. WHERE
  7. mfpa.period = (
  8. SELECT period
  9. FROM moa_fin_publish_archive
  10. WHERE confirm_status = 1
  11. ORDER BY period DESC
  12. LIMIT 1 )
  13. AND mfpa.confirm_status = 1

获取已确认的最新报表的信息

  1. SELECT type, period, creation_date ,draft_num, confirm_status, send_message_status
  2. FROM
  3. (SELECT type, period, creation_date ,draft_num, confirm_status, send_message_status
  4. FROM moa_fin_publish_archive
  5. WHERE confirm_status = 1
  6. <if test="period != null">AND period = #{period}</if>) a
  7. WHERE (
  8. SELECT count(1)
  9. FROM moa_fin_publish_archive b
  10. WHERE a.type = b.type
  11. AND a.creation_date < b.creation_date
  12. AND b.confirm_status = 1
  13. <if test="period != null">AND b.period = a.period</if>) < 1
  14. AND a.type != 'FIN_G'
  15. ORDER BY period desc

之所以在后面不用这个sql是因为我查出来的是一堆冗余字段。没有搞懂真实需求。需求只是统计一下报表的数量够不够,而我把它的具体的信息全查出来了。

找出质量小于50(商品表),销量大于20(订单表)的物品

  1. SELECT g.id,g.name,g.weight,tr.total from goods g
  2. inner join
  3. (SELECT t.goods_id,SUM(t.count) total from trans t group by t.goods_id HAVING SUM(t.count)>20) tr
  4. on tr.id = g.id
  5. and g.weight < 50
  6. order by g.id

去掉最大最小后的平均值

  1. SELECT (SUM(salary) - MAX(salary) - MIN(salary)) / (COUNT(1)-2) avg_salary
  2. FROM salaries where to_date = '9999-01-01';

自己做饶了路,总想去掉最大最小是找到最大最小的id然后用not in。为什么不直接求和减去最大最小就好了呢?