我有这样的表:
ID | 公里 | 日期 |
---|---|---|
1 | 5 | 20-5-2020 |
1 | 9 | 20-5-2020 |
3 | 7 | 20-5-2020 |
1 | 4 | 10-5-2020 |
3 | 2 | 10_5_2020 |
4 | 9 | 10_5_2020 |
我需要的是对当月每个 id 的公里数求和,我想要这样的结果:
ID | 公里 20 五月 | 公里 10 五月 |
---|---|---|
1 | 14 | 4 |
3 | 7 | 2 |
4 | 0 | 9 |
我试过这段代码,但没有得到我想要的结果
Select id,
sum(select km from info where date =='10_5_2020') as 'km 10 may',
Sum(select km from unfo where date == '20-5-2020') as 'km 20 may'
From info
您可以CASE
在总和中使用表达式来限制求和的内容:
SELECT id,
SUM(CASE WHEN date ='10_5_2020' THEN km ELSE 0 END) as 'km 10 may',
SUM(CASE WHEN date = '20-5-2020' THEN km ELSE 0 END) as 'km 20 may'
From info
GROUP BY id;
另外值得注意的是,如果您正在选择id
和进行聚合,那么您还需要分组id
附录
为了更详细地解释这一点,请考虑 case 表达式在没有 的情况下的作用SUM
:
ID | 公里 | 日期 | CASE WHEN date = '20-5-2020' THEN km ELSE 0 END | CASE WHEN date ='10_5_2020' THEN km ELSE 0 END |
---|---|---|---|---|
1 | 5 | 20-5-2020 | 5 | 0 |
1 | 9 | 20-5-2020 | 9 | 0 |
3 | 7 | 20-5-2020 | 7 | 0 |
1 | 4 | 10-5-2020 | 0 | 4 |
3 | 2 | 10_5_2020 | 0 | 2 |
4 | 9 | 10_5_2020 | 0 | 9 |
现在您的 SUM 所做的就是对这些派生列中的值求和。如果您删除ELSE 0
then 而不是0
您将进入NULL
这些列:
ID | 公里 | 日期 | CASE WHEN date = '20-5-2020' THEN km END | CASE WHEN date ='10_5_2020' THEN km END |
---|---|---|---|---|
1 | 5 | 20-5-2020 | 5 | 空值 |
1 | 9 | 20-5-2020 | 9 | 空值 |
3 | 7 | 20-5-2020 | 7 | 空值 |
1 | 4 | 10-5-2020 | 空值 | 4 |
3 | 2 | 10_5_2020 | 空值 | 2 |
4 | 9 | 10_5_2020 | 空值 | 9 |
你的 SUM 仍然可以工作,但如果没有匹配的值,0
你会得到的不是输出NULL
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句