一提到sum函数,大家第一个想到的是求和。
但在SQL中sum函数可不单单是求和,它有很神奇的用法哦!
行列转换:
1)表内容
如果要生成下列结果,该如何写sql语句?
遇到行列转换的问题第一个想到的方法就是用sum(if())和count(if())函数,但注意一点若用count(if())函数,一定是null,否则结果就会是错误的。
SQL语句运行原理:
得到最终结果
2、查找物流=2,服务=3,质量=5的评价id,表如下:
查找物流=2,服务=3,质量=5的评价id
方法1:
第一个想到的方法就是行列转化,把评价类别转化为列,最后找到符合物流=2,服务=3,质量=5的评价id
怎么转化呢?
还是用sum(if())
SELECT 用户id,评价id,
sum(if(评价类别='物流',评价星级,null))物流,
sum(if(评价类别='服务',评价星级,null))服务,
sum(if(评价类别='质量',评价星级,null))质量
from 评价表
GROUP BY 用户id,评价id;
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;
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;
方法二:
用sum(if())判断,然后再与评价星级相乘得到最终结果
select 评价id
from 评价表
group by 评价id,用户id
having sum((评价类别="物流")*评价星级)=2
and sum((评价类别="服务")*评价星级)=3
and sum((评价类别="质量")*评价星级)=5;