Sql 在查询末尾插入一行,其中包含总和列的总计

Sql 在查询末尾插入一行,其中包含总和列的总计,sql,sql-server,sql-server-2008,tsql,Sql,Sql Server,Sql Server 2008,Tsql,我目前有一个查询,它汇总了一组值,并按日期对它们进行分组。结果如下所示: Date Item2 Item2 Item3 Item4 Item5 2013-05-31 1 30 0 0 129 2013-06-03 0 90 0 15 78 2013-06-04 0 50 0 1 124 2013-06-05 0

我目前有一个查询,它汇总了一组值,并按日期对它们进行分组。结果如下所示:

Date        Item2   Item2   Item3   Item4   Item5
2013-05-31  1       30      0       0       129
2013-06-03  0       90      0       15      78
2013-06-04  0       50      0       1       124
2013-06-05  0       100     0       17      58
2013-06-06  0       24      0       0       105
2013-06-07  0       50      0       1       83
2013-06-10  0       45      2       42      64
2013-06-11  3       43      0       14      90
2013-06-12  2       44      0       36      88
2013-06-13  1       34      0       15      92
我用于检索该结果的查询如下所示

SELECT CONVERT(NVARCHAR(10), TheDate, 120) 'Date',  
            (SUM(CASE WHEN itemID = 1 THEN 1 ELSE 0 END)) AS Item1,
            (SUM(CASE WHEN itemID = 2 THEN 1 ELSE 0 END)) AS Item2,
            (SUM(CASE WHEN itemID = 3 THEN 1 ELSE 0 END)) AS Item3,
            (SUM(CASE WHEN itemID = 4 THEN 1 ELSE 0 END)) AS Item4,
            (SUM(CASE WHEN itemID = 5 THEN 1 ELSE 0 END)) AS Item5
FROM         Table1 AS a INNER JOIN
                      Table2 AS tab2 ON tab2.Table1ID = a.Table1ID LEFT OUTER JOIN
                      Table3 AS tab3 ON tab3.Table2ID = tab2.Table2ID
WHERE someOtherID = 3 AND UserID = 40
GROUP BY CONVERT(NVARCHAR(10), TheDate, 120)
ORDER BY CONVERT(NVARCHAR(10), TheDate, 120)
我希望看到的是在结果末尾插入一个“总计”行。最终输出如下所示

Date        Item2   Item2   Item3   Item4   Item5
2013-05-31  1       30      0       0       129
2013-06-03  0       90      0       15      78
2013-06-04  0       50      0       1       124
2013-06-05  0       100     0       17      58
2013-06-06  0       24      0       0       105
2013-06-07  0       50      0       1       83
2013-06-10  0       45      2       42      64
2013-06-11  3       43      0       14      90
2013-06-12  2       44      0       36      88
2013-06-13  1       34      0       15      92
GRAND TOTAL 7       510     2       141     911
有没有人对这样做的最佳方法有什么建议


Thank you=D

联合查询将是一种快速而肮脏的方法

SELECT CONVERT(NVARCHAR(10), TheDate, 120) 'Date',  
        (SUM(CASE WHEN itemID = 1 THEN 1 ELSE 0 END)) AS Item1,
        (SUM(CASE WHEN itemID = 2 THEN 1 ELSE 0 END)) AS Item2,
        (SUM(CASE WHEN itemID = 3 THEN 1 ELSE 0 END)) AS Item3,
        (SUM(CASE WHEN itemID = 4 THEN 1 ELSE 0 END)) AS Item4,
        (SUM(CASE WHEN itemID = 5 THEN 1 ELSE 0 END)) AS Item5
FROM         Table1 AS a INNER JOIN
                  Table2 AS tab2 ON tab2.Table1ID = a.Table1ID LEFT OUTER JOIN
                  Table3 AS tab3 ON tab3.Table2ID = tab2.Table2ID
WHERE someOtherID = 3 AND UserID = 40
GROUP BY CONVERT(NVARCHAR(10), TheDate, 120)
ORDER BY CONVERT(NVARCHAR(10), TheDate, 120)

UNION 

    SELECT 'GrandTotal',  
        (SUM(CASE WHEN itemID = 1 THEN 1 ELSE 0 END)) AS Item1,
        (SUM(CASE WHEN itemID = 2 THEN 1 ELSE 0 END)) AS Item2,
        (SUM(CASE WHEN itemID = 3 THEN 1 ELSE 0 END)) AS Item3,
        (SUM(CASE WHEN itemID = 4 THEN 1 ELSE 0 END)) AS Item4,
        (SUM(CASE WHEN itemID = 5 THEN 1 ELSE 0 END)) AS Item5
FROM         Table1 AS a INNER JOIN
                  Table2 AS tab2 ON tab2.Table1ID = a.Table1ID LEFT OUTER JOIN
                  Table3 AS tab3 ON tab3.Table2ID = tab2.Table2ID
WHERE someOtherID = 3 AND UserID = 40

您还可以在GROUP BY子句上使用WITHROLLUP选项

SELECT CASE GROUPING([TheDate])
              WHEN 1 THEN 'GRAND TOTAL'
              ELSE CONVERT(NVARCHAR(10), TheDate, 120) 
              END as Date
   ...
FROM         Table1 AS a INNER JOIN
                  Table2 AS tab2 ON tab2.Table1ID = a.Table1ID LEFT OUTER JOIN
                  Table3 AS tab3 ON tab3.Table2ID = tab2.Table2ID
WHERE someOtherID = 3 AND UserID = 40
GROUP BY CONVERT(NVARCHAR(10), TheDate, 120) WITH ROLLUP
ORDER BY CONVERT(NVARCHAR(10), TheDate, 120)

写得真快,埃利亚斯!我很精通抄袭。不开玩笑,非常令人印象深刻的埃利亚斯。Thank you=d在几分钟内无法选择作为答案。。。我没有忘记你!实际上,还有另一种方法可以使用group by上的
和Rollup
,如果性能是一个问题,那么可能值得研究,EDIT Sparky在他的回答中提到了这一点,