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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL - 按一个字段分组并汇总另一个字段?相关的知识,希望对你有一定的参考价值。

我有一个数据库,其中包含有关我网站上的项目的页面查看的数据。每行都有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相同的所有行分组,以便我可以得到每个项目的视图总和。

答案

只需使用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也是有效的。

另一答案

我认为您需要一个子查询,以便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;

以上是关于SQL - 按一个字段分组并汇总另一个字段?的主要内容,如果未能解决你的问题,请参考以下文章

sql中如何按某字段值的首字母分组?

thinkphp 如何得到一个按字段内容分组的array

SQL如何查询一张表的所有字段并按其中一个字段进行分组

获取分组的第一个和最后一个时间戳之间另一个字段的差异

SQL如何根据一个字段的某个关键词的前面部分分组查询

Linq,EF Core - 按一个字段分组并使用其他字段从其他表中获取数据列表