sql - 与连接求和给出错误的值
问题描述
我有一个查询对我的输出有奇怪的行为。
我的表看起来像这样:
表 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。
解决方案
问题是您试图将同一个补充表多次连接到主表,而补充表具有多对一的关系。
这是获得相同结果的更简单方法。首先,使用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'
推荐阅读
- python - 如果多条消息同时出现,如何处理 on_message mqtt paho 中的消息
- sorting - 按文本日期排序
- html - 当我在whatsapp上分享我的网站时没有得到我的网站的标题
- javascript - 数据更改时不会触发 useEffect
- html - 在笔划宽度进度条上添加内框阴影
- react-native - 创建阴影边框轮廓时不小心在我的文本上添加了阴影
- flutter - 尝试订购 Firestore 会导致查询
- java - 为什么netty中的recycler不恢复堆栈中的所有项目?
- javascript - 滑块问题推荐
- javascript - 我的不和谐机器人不会响应我的命令