sql - 多个总和聚合
问题描述
当我有多个具有 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 单独添加到每列中,但仍然遇到倍数。
解决方案
看起来您应该使用条件聚合并且只打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
推荐阅读
- angularjs - AngularJs 1.x:将拦截器添加到注入的模块
- c# - 为什么 Microsoft.Azure.ServiceBus 的 QueueClient 不回退到 HTTPS?
- java - 如何在 Android appium 中向上滚动
- machine-learning - 我在 RandomSearchCV 中不断收到 AttributeError
- javascript - ASP 不读取所有代码文本
- file - 逐行读取 clojure 文件后,如何从特定行获取特定字符串?
- excel - Excel使用基于一个单元格的另一张表中的信息填充相应的单元格
- powershell - 如何将字符串操作为多个整数?
- php - 使用 jQuery POST 插入数据库
- android - 给出错误未连接适配器;跳过布局