2017-07-26 76 views
0

我试图通过将一个分区的总和转换为普通的sql语句,但代码无法工作。技术:SQL服务器2014T-SQL-与分组结合使用分组的总和

下面的代码:

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在DER Auswahllisteungültig,哒SIE nicht在einer Aggregatfunktion UND nicht在DER GROUP BY-Klausel enthalten IST。

感谢谷歌翻译:因为它不是在聚合函数,并包含在GROUP不包含BY子句

的archiveZBEW.PROD.sFCTS_G195.NETTOBETRAG列是在选择列表中无效。

+1

我没看见GROUP BY'的要点请显示样本数据和预期结果,以使问题更清晰。 –

+0

Deutsche Fehlermeldungen bedeuten nichtsfürenglische Leser。 archiveZBEW.PROD.sFCTS_G195.NETTOBETRAG列在选择列表中无效,因为它不包含在聚合函数中,并且不包含在GROUP BY子句中。顺便说一句,我甚至不会说德语。 –

回答

2

完蛋了 - 谢谢你们 - 是我的一个大思路故障 - 这里的结果:

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') 
1

有使用SUM()OVER()与GROUP BY没有具体的问题,但你可能得到通过SUM()的相对于OVER存在困惑,并且忘记了它只是一个列,要么需要通过

概括本身,或提及该组中这是行不通的:

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 
0

你可以做更改下方,让您的工作代码:

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