SQL聚合查询和总和列

时间:2018-07-09 16:23:07

标签: sql sum aggregate

我有这张桌子(我把名字放在了需要的栏上)

iddip         date                 idv idc  val
47    2018-06-01 00:00:00.000   0   3   3   60  NULL    NULL
47    2018-06-01 00:00:00.000   0   1   3   200 NULL    NULL
47    2018-06-01 00:00:00.000   0   1   4   280 NULL    NULL
43    2018-06-01 00:00:00.000   0   3   2   510 NULL    NULL
53    2018-06-01 00:00:00.000   0   1   4   480 NULL    NULL
29    2018-06-01 00:00:00.000   0   3   2   510 NULL    NULL
2     2018-06-11 00:00:00.000   0   1   2   480 NULL    NULL
47    2018-06-02 00:00:00.000   0   1   3   100 NULL    NULL

我想获得这个:

id idc Totidv1 Totidv3 TOT
47   3     300     60  360
47   4     280      0  280
43   2       0    510  510
53   4     480      0  480
29   2       0    510  510
2    2     480      0  480

我能得到的最接近的是:

 SELECT DISTINCT(iddip),IDCENTROCOSTO,tot=SUM(VALORE),ord=( SELECT SUM(isnull(VALORE,0)) FROM VALORIVOCICDC WHERE IDVOCE='1' and iddip=v.IDDIP and IDCENTROCOSTO ='3' GROUP BY iddip,IDCENTROCOSTO),
  str=( SELECT SUM(isnull(VALORE,0)) FROM VALORIVOCICDC WHERE IDVOCE='3' and iddip=v.IDDIP and IDCENTROCOSTO ='3' GROUP BY iddip,IDCENTROCOSTO)
FROM VALORIVOCICDC v
GROUP BY v.iddip,IDCENTROCOSTO

但是它在totidv1和totisv3中返回错误的总和,我该怎么做?谢谢你的提示

1 个答案:

答案 0 :(得分:1)

您只需要在此处使用GROUP BY(没有区别)和一些CASE语句即可:

SELECT
    id,
    idc,
    SUM(CASE WHEN idv=3 THEN idv ELSE 0 END) as totidv1,
    SUM(CASE WHEN idv=1 THEN idv ELSE 0 END) as totidv3,
    SUM(idv) as Tot
FROM yourtable
GROUP BY id, idc

请注意,Distinct并不是像SELECT DISTINCT(somecolumn)那样可以调用的函数,它在功能上等效于SELECT DISTINCT somecolumn...,因为它对SELECT语句返回的整个记录​​集都有效