首页 > 解决方案 > 与连接求和给出错误的值

问题描述

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

我的表看起来像这样:

表 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 停用 2nd JOIN,我得到了正确的值 (29131,12)。这就是我得到的值,如果我在没有任何连接的情况下对正确的字段进行简单的选择。

正确的

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

希望有人可以帮助我解决这个问题。

这是一些示例

样本

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

结果如下所示:

错误的结果

你可以看到

这里

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

标签: sqlsql-serversyntaxleft-join

解决方案


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

这是获得相同结果的更简单方法。首先,使用CTE 中的CASE 语句表达式汇总所需的总和。然后,每个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'

推荐阅读