【问题标题】:SQL - Calculating a sum for each row in a nested select statementSQL - 计算嵌套选择语句中每一行的总和
【发布时间】:2022-01-13 13:27:08
【问题描述】:

这可能有一个相当简单的解决方案,但我已经苦苦挣扎了一段时间,由于对 SQL 非常陌生,因此找不到解决方案。我目前正在编写一个视图,我想在其中添加一个嵌套选择语句来使用 SUM 函数计算每一行的 KPI。 SUM 工作正常,但它对 all 值求和,而不是每行中的值。我尝试过使用 CTE 和窗口函数,但无法正常工作。

我的代码是:

SELECT
some variables as some aliases
...
, (SELECT SUM([EK_NETTO]+[F_PORTO]+[F_DIFFERENZ_OK])
        FROM [RDWH].[dbo].[F_WARENEINKAUF]
        WHERE [REKO_ID] IN('FAKTRG', 'OFFRG', 'PORTO', 'DIFFOK')
    ) as [gross_purchase_amount]
FROM [RDWH].[dbo].[F_WARENEINKAUF]

这是结果:

https://i.stack.imgur.com/dg3Nl.png

如您所见,每个供应商的价值都是相同的。

非常感谢任何帮助!

【问题讨论】:

  • 如果没有子查询的列只有[EK_NETTO]+[F_PORTO]+[F_DIFFERENZ_OK] 怎么样?
  • 原则上这是可行的,但我只想在满足 where 条件时对值求和,所以我想我会使用子查询来实现这一点......编辑:我需要多个不同的计算where 子句就像上面的一个,所以在代码之后会有更多类似的,不同的值被求和,不同的 where 子句被满足。我不知道如何以不同的方式实现它,所以我感谢任何输入!
  • 乘以 1 为真 0 为假
  • 你需要有一些列连接 sum 子查询和 F_WARENEINKAUF。
  • 您需要在子查询中从您的行中添加一列,因此子查询只会找到与主行匹配的项目。

标签: sql select sum subquery


【解决方案1】:

加入摘要可能会更有效。

以下查询假定公共字段是 local_supplier_code。

SELECT
...
, q.[gross_purchase_amount]
FROM [RDWH].[dbo].[F_WARENEINKAUF] t
LEFT JOIN 
(
    SELECT local_supplier_code
    , SUM([EK_NETTO]+[F_PORTO]+[F_DIFFERENZ_OK]) AS gross_purchase_amount
    FROM [RDWH].[dbo].[F_WARENEINKAUF]
    WHERE [REKO_ID] IN ('FAKTRG', 'OFFRG', 'PORTO', 'DIFFOK')
    GROUP BY local_supplier_code
) q ON q.[local_supplier_code] = t.[local_supplier_code]

或者你可以使用APPLY

SELECT
...
, a.[gross_purchase_amount]
FROM [RDWH].[dbo].[F_WARENEINKAUF] t
OUTER APPLY 
(
    SELECT SUM([EK_NETTO]+[F_PORTO]+[F_DIFFERENZ_OK]) AS gross_purchase_amount
    FROM [RDWH].[dbo].[F_WARENEINKAUF] t2
    WHERE t2.[local_supplier_code] = t.[local_supplier_code]
      AND [REKO_ID] IN ('FAKTRG', 'OFFRG', 'PORTO', 'DIFFOK')
) a

或使用SUM OVER
但是,此方法仅在汇总的记录在结果中时才有效。

SELECT
...
, SUM(CASE
      WHEN [REKO_ID] IN ('FAKTRG', 'OFFRG', 'PORTO', 'DIFFOK')
      THEN [EK_NETTO]+[F_PORTO]+[F_DIFFERENZ_OK]
      ELSE 0
      END) OVER (PARTITION BY [local_supplier_code]) AS [gross_purchase_amount]
FROM [RDWH].[dbo].[F_WARENEINKAUF] t

【讨论】:

  • 这行得通,非常感谢!!!
  • 酷。顺便说一句,我添加了第三个选项。
  • 第三个选项也很有魅力,谢谢!
  • 好的,请确保您了解窗口函数的工作原理。它使用结果的数据。因此,如果您更改查询以过滤掉 f.e. 'FAKTRG' 那么这个计算就是错误的。
猜你喜欢
  • 1970-01-01
  • 2011-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-22
相关资源
最近更新 更多