场景一:三张表的关联
select b.*,md.today_discard from (
SELECT a.xxx_code,sum(a.num) num,sum(a.amount) amount,
sum(case a.is_xy when 1 then 1 else 0 end ) yesxy,
sum(case a.is_xy when 0 then 1 else 0 end ) noxy
,convert(varchar(10),a.order_time,120) order_time
from (
SELECT
o.order_id,
o.order_time,
o.xxx_code,
o.is_xy,
o.amount,
od.num
FROM
xxx_yyy o,
(SELECT order_id,sum(od.num) num FROM xxx_yyy_zzz od GROUP BY order_id) od
WHERE
o.order_id= od.order_id
--and o.xxx_code='xxx'
--and convert(varchar(10),o.order_time,120) = '2019-08-07'
) a
group by a.xxx_code,convert(varchar(10),a.order_time,120)
) b
LEFT JOIN
(select md.cleaning_time,md.xxx_code,sum(cast (md.today_maded as int)) today_maded,
sum(cast (md.today_discard as int)) today_discard from xxx_history_xxx md GROUP BY md.cleaning_time,md.xxx_code) md
ON
b.xxx_code=md.xxx_code
and
b.order_time = md.cleaning_time
ORDER BY convert(varchar(10),b.order_time,120) DESC
在sql方面比较薄弱
这次编写总结如下:
写多表关联的报表语句时,基本上少不了聚合函数的使用,sum,count,group by等。
编写时,先从一张表写起,获取出自己需要的字段,然后在第二张表关联,获取需要的字段和数据
这个时候可能会出现聚合的结果出错,
分析的方法就是,先从子查询里面开始分析结果是否正确,在层层向外分析。
我在这里就出了一个错误,因为kfc_order 和kfc_order_dessert 表是一对多的关系,所以,导致子查询多出些数据,
于是解决思路有两个:
1.寻找其他关联字段,进一步精确数据。但是,我查看了,此二表无其他关联字段了,只有order_id关联。
2.把一对多中的“多表”group by聚合成一条新的字表,在用该结果和一表关联,此时结果就正常了。
最后与第三张表关联的时候,用到了左关联,实现无值填null的效果。
这里有个效果困惑了我很久
sum(case a.is_xy when 1 then 1 else 0 end ) yesxy,
sum(case a.is_xy when 0 then 1 else 0 end ) noxy
这个语句实现,把一个字段的两个值用查询结果的两个字段展示。
总的来说,就是在出现数据对不上的时候,由子结果到外结果的逻辑排查就对了。
场景二:对左右关联的理解
SELECT
kmc.id,
,kf.file_unid
FROM
xxx_yyy_config kmc
left JOIN zzz_file kf ON kmc.aaa_code = kf.aaa_code
WHERE
kmc.aaa_code = '123456'
AND kf.file_belong= 'kx'
像上面这个左关联语句就不能起到预期的效果
因为我们在where 后面又用到了右表的字段去筛选,从而导致left join失效。
正确写法如下:
SELECT
kmc.id,
,kf.file_unid
FROM
xxx_yyy_config kmc
left JOIN zzz_file kf ON kmc.aaa_code = kf.aaa_code AND kf.file_belong= 'kx'
WHERE
kmc.aaa_code = '123456'
注意到,右表的关联条件放到了left join on 后面了。
场景三:把查询的结果转换成xml
select * from kfc_user FOR XML PATH;
结果: