与合计的总和给出错误的值

问题描述

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

我的表看起来像这样:

桌位 列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 ..该值是错误的!

wrong

如果我用2和22停用第二个JOIN,则得到正确的值(29131,12)。 如果我在正确的字段上进行简单选择而没有任何联接,那就是我得到的价值。

right

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

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

这里有一些样品

sample

当我为US = 2增加一个更多的值时,就会加上20。 如果我限制2和22的联接怎么办?

结果如下:

wrong result

你可以看到

here

将值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'

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...