问题描述
我的表看起来像这样:
桌位 列Abrechnungsnummer(varchar),KST_Leistung(varchar),ZZ_Euro(货币),GG_Euro(货币),Rezept_ID(varchar),Rechnungsart(varchar)
表Leistungen_pos 列Rezept_ID(varchar),US(varchar),
表使用“ Rezept_ID”进行连接。输出必须按Abrechnungsnummer和KST_Leistung分组。每个SUM取决于US字段(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。
解决方法
问题是您试图将同一张补充表多次连接到主表,并且补充表具有多对一关系。
这是一种获得相同结果的简便方法。首先,在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'