gpt4 book ai didi

sql - 分区总和

转载 作者:行者123 更新时间:2023-12-02 04:15:46 25 4
gpt4 key购买 nike

我错过了什么?

此查询一遍又一遍地返回重复的数据。对于完整的总数来说,计数是正确的,但我期望一行,但我得到的值重复了大约 40 次。有什么想法吗?

SELECT BrandId
,SUM(ICount) OVER (PARTITION BY BrandId )
FROM Table
WHERE DateId = 20130618

我明白了吗?

BrandId ICount
2 421762
2 421762
2 421762
2 421762
2 421762
2 421762
2 421762
1 133346
1 133346
1 133346
1 133346
1 133346
1 133346
1 133346

我错过了什么?

我无法删除分区,因为整个查询如下:

SELECT BrandId
,SUM(ICount) OVER (PARTITION BY BrandId)
,TotalICount= SUM(ICount) OVER ()
,SUM(ICount) OVER () / SUM(ICount) OVER (PARTITION BY BrandId) as Percentage
FROM Table
WHERE DateId = 20130618

这会返回:

BrandId (No column name)    TotalICount Percentage
2 421762 32239892 76
2 421762 32239892 76
2 421762 32239892 76
2 421762 32239892 76
2 421762 32239892 76
2 421762 32239892 76

我希望输出类似这样的内容,而不必使用不同的:

BrandId (No column name)    TotalICount Percentage
2 421762 32239892 76
9 1238442 32239892 26
10 1467473 32239892 21

最佳答案

在我看来,我认为在使用 OVER() 子句求和时解释 SQL 中为什么需要 GROUP BY 背后的原因非常重要,并且为什么当您期望每个 BrandID 一行时,会获取重复的数据行。

举个例子:您需要汇总两个日期之间每个订单行、每个特定订单类别的总销售价格,但您还需要在最终结果中保留单个订单数据。 SalesPrice 列上的 SUM() 不允许您获得正确的总计,因为它需要 GROUP BY,因此会压缩详细信息,因为您无法在 select 语句中保留各个订单行。

很多时候,我们会看到 #temp 表、@table 变量或 CTE 填充了我们的数据总和并分组,以便我们稍后可以再次连接到它以获得我们需要的总和列。这会增加处理时间和额外的代码行。相反,请像这样使用 OVER(PARTITION BY ()):

SELECT
OrderLine,
OrderDateTime,
SalePrice,
OrderCategory,
SUM(SalePrice) OVER(PARTITION BY OrderCategory) AS SaleTotalPerCategory
FROM tblSales
WHERE OrderDateTime BETWEEN @StartDate AND @EndDate

请注意,我们没有分组,并且选择了单独的订单行列。最后一列中的 PARTITION BY 将返回每个类别中每行数据的销售价格总计。最后一列的实质内容是,我们希望销售价格总和(SUM(SalePrice)) 超过 我的结果的分区和指定类别(OVER(PARTITION BY CategoryHere))。 p>

如果我们从 select 语句中删除其他列,并保留最终的 SUM() 列,如下所示:

SELECT
SUM(SalePrice) OVER(PARTITION BY OrderCategory) AS SaleTotalPerCategory
FROM tblSales
WHERE OrderDateTime BETWEEN @StartDate AND @EndDate

结果仍将为原始结果集中的每一行重复此总和。原因是此方法不需要 GROUP BY。如果您不需要保留单独的行数据,则只需使用 SUM() 而不使用 OVER() 即可对数据进行适当的分组。同样,如果您需要具有特定总计的附加列,则可以使用上述 OVER(PARTITION BY ()) 方法,而无需附加选择来连接回。

以上内容纯粹是为了解释为什么他会得到相同数字的重复行,并帮助理解该条款提供的内容。这种方法可以通过多种方式使用,我强烈建议进一步阅读此处的文档:

Over Clause

关于sql - 分区总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17867807/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com