T-SQL- 分区总和与分组依据相结合



我正在尝试将分区总和放入普通的sql语句中,但代码不起作用。技术: SQL Server 2014

这是代码:

select  
ZABF$,ZUNR$,ZONR$,FPLN$,ZSTR$,right(left(GABS$,3),2) as Region
,SUM(Nettobetrag) AS NettoUmsatz
,SUM(BRUTTOBETRAG) AS BruttoUmsatz
,SUM(Nettobetrag) over (partition by ZABF$,ZUNR$,ZONR$,FPLN$,right(left(GABS$,3),2))
from
ArchivZBEW.PROD.sFCTS_G195
where 
NETTOBETRAG<>0 and right(left(GABS$,3),2)<>'65' 
and UTYP$ in('K','M','P')
group by
ZABF$,ZUNR$,ZONR$,FPLN$,ZSTR$,right(left(GABS$,3),2)

如您所见,我尝试在第一行获得所有列的输出,然后是不同的总和。NettoUmsatz 和 Bruttoumsatz 工作正常,正如预期的那样 - 但现在我需要另一个忽略"ZSTR$"字段的总和。我将此查询作为 CTE 的一部分,因此最好将其包含在此语句中,否则我必须两次加入表并且语句变得非常慢。

错误代码:(德语(:

死ArchivZBEW.PROD.sFCTS_G195。NETTOBETRAG-Spalte ist in der Auswahlliste ungültig, da sie nicht in einer Aggregatfunktion und nicht in der GROUP BY-Klausel enthalten ist.

感谢谷歌翻译:

archiveZBEW.PROD.sFCTS_G195。NETTOBETRAG 列在选择列表中无效,因为它不包含在聚合函数中,也不包含在 GROUP BY 子句中。

将 SUM((OVER((与 GROUP BY 一起使用没有特定的问题,但您可能会对 SUM(( 与 OVER 相关的存在感到困惑,并且忘记了它只是另一列,要么需要 SUMMED 本身,要么在组中通过

这不起作用:

SELECT
a,
SUM(b),
SUM(c) OVER(PARTITION BY a) --this wont work: c is not mentioned in GROUP BY and this column is not an aggregate in the GROUP  BY sense
FROM
table
GROUP BY 
a

您必须:

SELECT
a,
SUM(b),
SUM(c) OVER(PARTITION BY a)
FROM
table
GROUP BY 
a, c --make c something you group by

或:

SELECT
a,
SUM(b),
SUM(SUM(c) OVER(PARTITION BY a)) --inner sum is overed, outer is groupbyed
FROM
table
GROUP BY 
a

或:

SELECT
a,
SUM(b),
SUM(SUM(c)) OVER(PARTITION BY a) --inner SUM is groupbyed, outer sum is overed
FROM
table
GROUP BY 
a

就是这样 - 谢谢大家 - 是我的一个很大的思想错误 - 这是结果:

select  DISTINCT
ZABF$,ZUNR$,ZONR$,FPLN$,ZSTR$,right(left(GABS$,3),2) as Region
,SUM(Nettobetrag) over (partition by ZABF$,ZUNR$,ZONR$,FPLN$,ZSTR$,right(left(GABS$,3),2)) AS NettoUmsatz
,SUM(BRUTTOBETRAG) over (partition by ZABF$,ZUNR$,ZONR$,FPLN$,ZSTR$,right(left(GABS$,3),2)) AS BruttoUmsatz
,SUM(Nettobetrag) over (partition by ZABF$,ZUNR$,ZONR$,FPLN$,right(left(GABS$,3),2))
from
ArchivZBEW.PROD.sFCTS_G195
where 
--NETTOBETRAG<>0 
right(left(GABS$,3),2)<>'65' 
and UTYP$ in('K','M','P')

您可以进行以下更改以使代码正常工作:

select  
ZABF$,ZUNR$,ZONR$,FPLN$,ZSTR$,right(left(GABS$,3),2) as Region
,SUM(Nettobetrag) AS NettoUmsatz
,SUM(BRUTTOBETRAG) AS BruttoUmsatz
-- ,SUM(Nettobetrag) over (partition by ZABF$,ZUNR$,ZONR$,FPLN$,right(left(GABS$,3),2)) --commented as this is same as nettoUmsatz
from
ArchivZBEW.PROD.sFCTS_G195
where 
--NETTOBETRAG<>0 and  --sum has to be in having
right(left(GABS$,3),2)<>'65' 
and UTYP$ in('K','M','P')
group by
ZABF$,ZUNR$,ZONR$,FPLN$,ZSTR$,right(left(GABS$,3),2)
having SUM(Nettobetrag) <> 0 --you might require this

最新更新