代码之家  ›  专栏  ›  技术社区  ›  Gabriele Cozzolino

SQL聚合查询和求和列

  •  0
  • Gabriele Cozzolino  · 技术社区  · 6 年前

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

    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 回复  |  直到 6 年前
        1
  •  1
  •   JNevill    6 年前

    您只需要这里的一个组(不是不同的)和几个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语句返回的整个记录集都有效。