首页 > 解决方案 > 多个总和聚合

问题描述

当我有多个具有 sum 聚合的列时,我遇到了一个问题,导致形成多行而不是仅仅一个。每个代码单独运行时,只会产生一行,但是一旦我有多个聚合,它就会成倍增加;所有相同的值。

这是我的代码现在看起来的粗略示例:

SELECT
    (SELECT (SUM(Units * Price) 
     FROM SalesDetail 
     WHERE CONVERT(VARCHAR(10), DATEADD(day, CONVERT(int, JulianDate) - ((1000*(CONVERT(int, JulianDate) / 1000))) - 1, DATEADD(year, CONVERT(int, JulianDate / 1000), '1 Jan 1900')), 111) LIKE '2018%' G AS ‘2018 Sales’,
    (SELECT (SUM(Units * Price) 
     FROM SalesDetail 
     WHERE CONVERT(VARCHAR(10),DATEADD(day, CONVERT(int,JulianDate)-((1000*(CONVERT(int,JulianDate)/1000)))-1, DATEADD(year,CONVERT(int,JulianDate/1000),'1 Jan 1900')),111)  like '2019%' as ‘2019 Sales’
FROM 
     SalesDetail

我意识到我可以使用 Top 1 来减少这些,但我需要对这个查询做进一步的分析,这会被那个编码破坏

我尝试将前 1 单独添加到每列中,但仍然遇到倍数。

标签: sqlsql-servertsql

解决方案


看起来您应该使用条件聚合并且只打SalesDetail一次表。我无法对此进行测试-但是我相信这就是您所需要的

select 
    sum (case when CONVERT(VARCHAR(10),DATEADD(day, CONVERT(int,JulianDate)-((1000*(CONVERT(int,JulianDate)/1000)))-1, DATEADD(year,CONVERT(int,JulianDate/1000),'1 Jan 1900')),111) LIKE '2018%' then Units*Price end) as [2018 Sales],
    Sum (case when CONVERT(VARCHAR(10),DATEADD(day, CONVERT(int,JulianDate)-((1000*(CONVERT(int,JulianDate)/1000)))-1, DATEADD(year,CONVERT(int,JulianDate/1000),'1 Jan 1900')),111) LIKE '2019%' then Units*Price end) as [2019 Sales]
from SalesDetail

推荐阅读