sqlserver常用报表语句汇总及思维方式总结

场景一:三张表的关联


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;

结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值