【问题标题】:Sum with join giving wrong value与连接求和给出错误的值
【发布时间】:2020-09-10 07:53:26
【问题描述】:

我有一个查询对我的输出产生了奇怪的行为。

我的表格如下所示:

表 Leistungen 列 Abrechnungsnummer(varchar)、KST_Leistung(varchar)、ZZ_Euro(money)、GG_Euro(money)、Rezept_ID(varchar)、Rechnungsart(varchar)

表 Leistungen_pos 列 Rezept_ID(varchar)、US(varchar)、

这些表使用“Rezept_ID”进行连接。输出必须按 Abrechnungsnummer 和 KST_Leistung 分组。每个 SUM 都依赖于 US-Field(1 和 21 一起,2 和 22 等等..)。 问题是,第二次加入改变了我第一次加入的第一个 SUM 的输出。

SELECT dbo.Leistungen.Abrechnungsnummer,
CASE WHEN (dbo.Leistungen.KST_Leistung = '') THEN 'ohne' ELSE dbo.Leistungen.KST_Leistung END AS Kostenstellen,
CASE WHEN (SUM(lposK_US1.GG_Euro) IS NULL) THEN 0 ELSE SUM(lposK_US1.GG_Euro) END AS SummeGesamtKasse19,
CASE WHEN (SUM(lposK_US2.GG_Euro) IS NULL) THEN 0 ELSE SUM(lposK_US2.GG_Euro) END AS SummeGesamtKasse7, 
CASE WHEN (SUM(lposK_US3.GG_Euro) IS NULL) THEN 0 ELSE SUM(lposK_US3.GG_Euro) END AS SummeGesamtKasse16,
CASE WHEN (SUM(lposK_US4.GG_Euro) IS NULL) THEN 0 ELSE SUM(lposK_US4.GG_Euro) END AS SummeGesamtKasse5
FROM dbo.Leistungen
LEFT OUTER JOIN dbo.Leistungen_Pos AS lposK_US1 ON lposK_US1.Rezept_ID = dbo.Leistungen.Rezept_ID AND dbo.Leistungen.Rechnungsart = 'K' AND lposK_US1.US IN ('1', '21')
LEFT OUTER JOIN dbo.Leistungen_Pos AS lposK_US2 ON lposK_US2.Rezept_ID = dbo.Leistungen.Rezept_ID AND dbo.Leistungen.Rechnungsart = 'K' AND lposK_US2.US IN ('2', '22')
LEFT OUTER JOIN dbo.Leistungen_Pos AS lposK_US3 ON lposK_US3.Rezept_ID = dbo.Leistungen.Rezept_ID AND dbo.Leistungen.Rechnungsart = 'K' AND lposK_US3.US IN ('3', '23')
LEFT OUTER JOIN dbo.Leistungen_Pos AS lposK_US4 ON lposK_US4.Rezept_ID = dbo.Leistungen.Rezept_ID AND dbo.Leistungen.Rechnungsart = 'K' AND lposK_US4.US IN ('4', '24')
WHERE Abrechnungsnummer = '5432200101'
GROUP BY dbo.Leistungen.Abrechnungsnummer, dbo.Leistungen.KST_Leistung

我的问题是,我的查询的第一行有一个值,即 29181,52.. 这个值是错误的!

如果我用 2 和 22 停用第二个 JOIN,我得到了正确的值 (29131,12)。 如果我在没有任何连接的情况下对正确的字段进行简单选择,这就是我得到的值。

当我使用第二个连接并将其视为独立结果时,我无法解释为什么此 SQL 会在我的第一行添加一个小值。 一定是语法错误,因为我查过数据,是合理的。

希望有人能帮我解决这个问题。

这里有一些示例

只要我为 US=2 添加更多值,它就会添加值 20。 如果我限制 2 和 22 的加入,怎么会发生这种情况?

结果如下所示:

你可以看到

它将值 7 放在同一行中。相反,它必须在他自己的行中,第二个 20 值必须为 NULL。

【问题讨论】:

  • 轻松为您提供帮助 - 简化问题! (minimal reproducible example.)
  • 猜测你有一个多对一的关系,所以当你 JOINSUM 相同的值 2 次或更多次。
  • 如果没有重现问题的示例数据,将很难为您提供帮助。
  • lposK_US2.Rezept_ID字段是否有重复值?
  • 请不要将数据发布为图像,使用格式化文本。

标签: sql sql-server syntax left-join


【解决方案1】:

问题是您试图将同一个补充表多次连接到主表,而补充表具有多对一的关系。

这是获得相同结果的更简单方法。首先,使用 CTE 中的 CASE statement 表达式汇总所需的总和。那么每个Rezept_ID 将只有一行。

然后将 CTE 连接回主表。

;WITH summarise AS (
SELECT
 a.Rezept_ID,
 SUM(CASE WHEN a.US IN ('1','21') THEN a.GG_Euro ELSE 0 END) AS SummeGesamtKasse19,
 SUM(CASE WHEN a.US IN ('2','22') THEN a.GG_Euro ELSE 0 END) AS SummeGesamtKasse7,
 SUM(CASE WHEN a.US IN ('3','23') THEN a.GG_Euro ELSE 0 END) AS SummeGesamtKasse16,
 SUM(CASE WHEN a.US IN ('4','24') THEN a.GG_Euro ELSE 0 END) AS SummeGesamtKasse5
FROM
 dbo.Leistungen_Pos a
WHERE
 a.US IN ('1','21','2','22','3','23','4','24')
GROUP BY
 a.Rezept_ID
)
SELECT
 l.Abrechnungsnummer,
 l.Rezept_ID,
 CASE WHEN l.KST_Leistun = '' THEN 'ohne' ELSE KST_Leistun END AS Kostenstellen, 
 s.SummeGesamtKasse19,
 s.SummeGesamtKasse7,
 s.SummeGesamtKasse16,
 s.SummeGesamtKasse5
FROM
 dbo.Leistungen l
  LEFT OUTER JOIN
 summarise as s
  ON
   l.Rezept_ID = s.Rezept_ID
WHERE
 l.Abrechnungsnummer = '5432200101'

【讨论】:

  • case expression not statement :)
  • @DaleK 我不是第一次犯这个错误。 :) 事实上,甚至还有一个question on it
猜你喜欢
  • 2014-03-05
  • 2016-07-01
  • 1970-01-01
  • 2018-08-21
  • 1970-01-01
  • 2017-08-21
  • 2018-08-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多