多和聚合

ttisahbt  于 2021-07-26  发布在  Java
关注(0)|答案(2)|浏览(254)

关闭。这个问题需要更加突出重点。它目前不接受答案。
**想改进这个问题吗?**通过编辑这篇文章更新这个问题,使它只关注一个问题。

昨天关门了。
改进这个问题
我遇到了一个问题,当我有多个列的总和聚合导致多行形成,而不是只有一个。每个代码单独运行时,只会产生一行,但一旦我有多个聚合,它就会成倍增加;所有相同的值。
下面是我的代码现在的大致示例:

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个,但仍然会出现倍数。

f0brbegy

f0brbegy1#

看起来您应该使用条件聚合,并且只对 SalesDetail 一张table。我无法测试这个-但是我相信这是你需要的

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
hof1towb

hof1towb2#

听起来你只是想摆脱 FROM SalesDetail 部分,在查询主体的底部。
现在,它正在选择 SalesDetail (主要 FROM 条款,没有 WHERE 条款)。对于这些行中的每一行,所选列都由生成聚合的两个子查询组成。所以,它显示了总次数-存在于中的每一行一次 SalesDetail .
卸下主泵 FROM 子句将导致子查询只运行一次,并且只生成一行。

相关问题