sql server sum 遇到负数怎么处理?_SQL中的sum函数的妙用——行列转换

948ed34c40b7a42646f5ed23de2deb46.png

一提到sum函数,大家第一个想到的是求和。

但在SQL中sum函数可不单单是求和,它有很神奇的用法哦!

行列转换:

1)表内容

0a29a1c60d1373ecbf00f626a411da19.png

如果要生成下列结果,该如何写sql语句?

54645256d9fb9c22e4c14562a2e8fda2.png

遇到行列转换的问题第一个想到的方法就是用sum(if())和count(if())函数,但注意一点若用count(if())函数,一定是null,否则结果就会是错误的。

763230700ae41cc09137c4241021ee05.png

SQL语句运行原理:

a49ca5fb6ce0c2f1e4d1d0bd0c48005d.png

83ce3ec76be0374b744712674714da38.png

04fa776eb6d402c826e802d517028e6b.png

得到最终结果

f51acd173d987db289281c6f0e380ccb.png

2、查找物流=2,服务=3,质量=5的评价id,表如下:

948980a20d1066603d5402d54c3bba4b.png

查找物流=2,服务=3,质量=5的评价id

方法1:

第一个想到的方法就是行列转化,把评价类别转化为列,最后找到符合物流=2,服务=3,质量=5的评价id

86ea0715b3b2433253618df21b28c509.png

怎么转化呢?

还是用sum(if())

SELECT 用户id,评价id,
sum(if(评价类别='物流',评价星级,null))物流,
sum(if(评价类别='服务',评价星级,null))服务, 
sum(if(评价类别='质量',评价星级,null))质量
from 评价表
GROUP BY 用户id,评价id;

a2c202f9953b2e55536ef9c9915cdb26.png
SELECT * FROM
(SELECT 用户id,评价id,
sum(if(评价类别='物流',评价星级,null))物流,
sum(if(评价类别='服务',评价星级,null))服务, 
sum(if(评价类别='质量',评价星级,null))质量
from 评价表
GROUP BY 用户id,评价id)a
WHERE 物流=2 and 服务=3 and 质量=5;

0ee2cc670a8fe1a800fd10e06890f6f1.png
select 评价id FROM
(SELECT 用户id,评价id,
sum(if(评价类别='物流',评价星级,null))物流,
sum(if(评价类别='服务',评价星级,null))服务, 
sum(if(评价类别='质量',评价星级,null))质量
from 评价表
GROUP BY 用户id,评价id)a
WHERE 物流=2 and 服务=3 and 质量=5;

19174e60e6b0000e1356ffe1e0d1257b.png

方法二:

用sum(if())判断,然后再与评价星级相乘得到最终结果

3c65eb484022fb6539ce428411b1677c.png

2dea9fcfe4c129021ea2c40f302a18f1.png

971b6b297409173bf98acc2c090b72ce.png
select 评价id
from 评价表
group by 评价id,用户id
having sum((评价类别="物流")*评价星级)=2
and sum((评价类别="服务")*评价星级)=3
and sum((评价类别="质量")*评价星级)=5;

90322b8755c8fb46adbfc218011fd9dc.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值