代码之家  ›  专栏  ›  技术社区  ›  Prashant Pimpale Dila Gurung

如何在带有动态列的SQL中使用SUM函数

  •  0
  • Prashant Pimpale Dila Gurung  · 技术社区  · 8 年前

    我在临时表中安排了一个带有动态透视的结果,如下所示:

    --------------------------------------------------------
    | City        | 2018-07-14 | 2018-07-15  |  2018-07-16 |
    --------------------------------------------------------
    | Satara      |     3      |      9      |      1      |
    | Maharashtra |     0      |      4      |      1      |
    | Ghatkopar   |     10     |      1      |      1      |
    --------------------------------------------------------
    

    预期输出:

    ----------------------------------------------------------------------
    | City        |  2018-07-14 | 2018-07-15 | 2018-07-16 |    Total     |
    ---------------------------------------------------------------------
    | Satara      |   3         |     9      |      1     |      13      |
    | Maharashtra |   0         |     4      |      1     |      5       |
    | Ghatkopar   |   10        |     1      |      1     |      12      |
    ----------------------------------------------------------------------
     NULL         |   13        |     14    |      3      |      30      |
    --------------------------------------------------------------------
    

    最后三列是日期,它是动态的 Today's Date - 3 Days

    1 回复  |  直到 8 年前
        1
  •  1
  •   Max Szczurek    8 年前

    DECLARE @tbl TABLE (City VARCHAR(25), [2018-07-14] int, [2018-07-15] int, 
        [2018-07-16] int, Total AS [2018-07-14] + [2018-07-15] + [2018-07-16])
    
    INSERT INTO @tbl VALUES ('Satara', 3, 9, 1)
    INSERT INTO @tbl VALUES ('Maharashtra', 0, 4, 1)
    INSERT INTO @tbl VALUES ('Ghatkopar', 10, 1, 1)
    
    SELECT City, SUM([2018-07-14]) AS [2018-07-14], 
        SUM([2018-07-15]) AS [2018-07-15], 
        SUM([2018-07-16]) AS [2018-07-16],
        SUM(Total) AS Total
    FROM @tbl
    GROUP BY ROLLUP (City);
    

    City        2018-07-14  2018-07-15  2018-07-16  Total
    Ghatkopar   10          1           1           12
    Maharashtra 0           4           1           5
    Satara      3           9           1           13
    NULL        13          14          3           30
    

    DECLARE @D1 VARCHAR(10) = FORMAT(GETDATE() - 2, 'yyyy-MM-dd')
    DECLARE @D2 VARCHAR(10) = FORMAT(GETDATE() - 1, 'yyyy-MM-dd')
    DECLARE @D3 VARCHAR(10) = FORMAT(GETDATE(), 'yyyy-MM-dd')
    
    DECLARE @SQL NVARCHAR(MAX)
    SELECT @SQL = '
    SELECT City, SUM([' + @D1 + ']) AS [' + @D1 + '], 
        SUM([' + @D2 + ']) AS [' + @D2 + '], 
        SUM([' + @D3 + ']) AS [' + @D3 + '],
        SUM([' + @D1 + '] + [' + @D2 + '] + [' + @D3 + ']) AS Total
    FROM tbl
    GROUP BY ROLLUP (City);'
    
    EXEC sp_executesql @SQL