2017-07-26 48 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