如何在SQL查询中仅按GROUP BY的两个指定字段执行SUM聚合?
调整SQL分组聚合的两种方案
要实现仅按月份起始日和W2CliendId两个维度聚合Value,核心是修改GROUP BY子句,同时处理好原查询中依赖TypeId的Type列(因为不再按TypeId分组,这部分需要根据你的需求调整)。以下是两种适配不同场景的方案:
方案1:仅汇总总数值,无需区分类型
如果不需要保留Type相关的分类信息,直接移除所有和TypeId绑定的逻辑即可:
SELECT W2CliendId, CAST(DATEADD(month, DATEDIFF(month, 0, Date), 0) AS date) AS MonthStarts, SUM(Value) AS [TotalValue] -- 重命名字段更清晰地表示是总数值 FROM CompanyTypeValues CTV JOIN CompanyProfile CP ON CP.CompanyId = CTV.CompanyId WHERE CP.Status = 0 AND Date >= '2015-08-11' GROUP BY CAST(DATEADD(month, DATEDIFF(month, 0, Date), 0) AS date), W2CliendId ORDER BY MonthStarts, W2CliendId
说明:删除了原查询中
CASE WHEN生成的Type列,以及GROUP BY里的TypeId,直接按月份和W2CliendId汇总所有类型的Value总和。
方案2:保留类型信息,合并展示
如果需要在同一分组下看到包含的所有类型,可以用字符串聚合函数(以SQL Server的STRING_AGG为例)将类型合并:
SELECT W2CliendId, CAST(DATEADD(month, DATEDIFF(month, 0, Date), 0) AS date) AS MonthStarts, STRING_AGG( CASE WHEN TypeId = 1 THEN '4 Search views' WHEN TypeId = 2 THEN '5 Maps views' WHEN TypeId = 0 THEN 'Unknown' END, ', ' ) AS [IncludedTypes], SUM(Value) AS [TotalValue] FROM CompanyTypeValues CTV JOIN CompanyProfile CP ON CP.CompanyId = CTV.CompanyId WHERE CP.Status = 0 AND Date >= '2015-08-11' GROUP BY CAST(DATEADD(month, DATEDIFF(month, 0, Date), 0) AS date), W2CliendId ORDER BY MonthStarts, W2CliendId
说明:用
STRING_AGG将同一分组下的所有类型合并为逗号分隔的字符串,同时保留总数值的聚合,GROUP BY仅保留目标维度。
另外注意:原查询中的W2CliendId疑似拼写错误(应为W2ClientId),如果是笔误记得修正,避免查询报错。
内容的提问来源于stack exchange,提问作者demo
相关产品推荐
相关产品推荐

