SQL - 按一个字段分组并汇总另一个字段?

时间:2017-12-20 15:28:03

标签: sql group-by sum aggregate

我有一个数据库,其中包含有关我网站上项目的网页浏览量的数据。每行都有Date,ItemId(guid字符串)和Views(int)。在不同日期有许多行具有相同的ItemId。我想用视图的总和将所有这些聚合成一行。例如:

Date                   |ItemId                               |Views
2017-12-18 20:18:00    |6B3B4A9E-B64B-4BAF-9ABA-42F486CC70AB |1
2017-12-17 20:18:00    |6B3B4A9E-B64B-4BAF-9ABA-42F486CC70AB |3
2017-12-12 20:18:00    |6B3B4A9E-B64B-4BAF-9ABA-42F486CC70AB |5
2017-12-07 20:18:00    |6B3B4A9E-B64B-4BAF-9ABA-42F486CC70AB |1

我想得到以下内容:

ItemId                               | Views
6B3B4A9E-B64B-4BAF-9ABA-42F486CC70AB | 10

此外,我需要能够按日期过滤,例如WHERE [Date] between '12/15/2017' and GetDate()

Where子句很简单,但我该如何进行分组/求和?请记住,我不是只汇总一个ItemId,我想将ItemId相同的所有行分组,以便我可以得到每个项目的视图总和。

2 个答案:

答案 0 :(得分:2)

只需使用GROUP BY

SELECT
    ItemId,
    SUM(Views) AS Views
FROM yourTable
WHERE [Date] BETWEEN '2017-12-15' AND GETDATE()
GROUP BY ItemId;

附注,但是here is a link到MSDN文档,描述了SQL Server的有效日期/时间文字。我更喜欢使用上面给出的ISO格式,但您使用的m/d/y也是有效的。

答案 1 :(得分:0)

我认为你需要一个子查询,因此WHERE子句限制不会改变整体视图计数。如下所示:

SELECT
    ItemId,
    sum(Views) as viewCount
FROM table t1
WHERE exists (Select itemid From table t2 Where t2.itemid = t1.itemid and [Date] BETWEEN '2017-12-15' AND GETDATE())
GROUP BY ItemId;