【问题标题】:SQL Server query : get the sum conditionallySQL Server 查询:有条件地获取总和
【发布时间】:2015-04-13 04:07:16
【问题描述】:

给定数据

我需要通过包含SalesNew 列来解决这个问题:

SalesNew 列将有条件地根据其组号计算每个项目的销售额总和。

示例基于上表。当项目的组数为 1 时,它只会复制或保留其销售。当它不是 1 时,SalesNew 列应该获得每组所有商品的总和,就像在给定的示例中,salesNew 为商品 3 和商品 4 显示 20,因为它将它们的销售额都添加了 10。所以商品 3 和 4 的 salesNew 值是 20。

我知道 sum 函数,但这不会显示所需的输出。我希望任何人都可以帮助我解决这个问题。

提前致谢

【问题讨论】:

  • Sorry:(。但我无法理解,能否请您举例说明一下?
  • 你现在已经解释得很清楚了。我会尽力帮助你的。

标签: c# asp.net sql-server vb.net


【解决方案1】:

您可以使用SUM(Sales) OVER(PARTITION BY [Group]),结合CASE

SELECT *,
    salesNew = 
        CASE
            WHEN [Group] = 1 THEN Sales
            ELSE SUM(Sales) OVER(PARTITION BY [Group])
        END
FROM Data

SQL Fiddle


你也可以使用CROSS APPLY:

SELECT
    d.*, 
    salesNew = 
        CASE
            WHEN [Group] = 1 THEN Sales
            ELSE x.salesNew
        END
FROM Data d
CROSS APPLY(
    SELECT salesNew = SUM(Sales)
    FROM Data
    WHERE [Group] = d.[Group]
)x

SQL Fiddle

【讨论】:

  • 您可以推荐什么以获得更好的性能?我正在尝试你的第一个代码。
  • 我会选择CROSS APPLY,但为了确保您应该进行测试。顺便说一句,我对CROSS APPLY 方法进行了编辑。
  • 分区已经工作了,交叉应用看起来更长,考虑到快速性能,使用它真的更好吗?我也试试看。
  • 非常感谢!我更喜欢分区,因为它更短,并且在交叉应用的速度方面没有显着差异。再次感谢!你是上天派来的。 @wewestthemenace
  • 没问题。很高兴我能帮上忙。
猜你喜欢
  • 2015-09-18
  • 2012-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多