T-SQL-Sum over Partition by 与 group by 组合

Posted

技术标签:

【中文标题】T-SQL-Sum over Partition by 与 group by 组合【英文标题】:T-SQL- Sum over Partition by in combination with group by 【发布时间】:2017-07-26 08:37:53 【问题描述】:

我正在尝试通过一个普通的 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 的一部分,因此最好将它包含在此语句中,否则我必须加入表两次,并且语句变得非常慢。

错误代码:(德语):

Die 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 子句中。

【问题讨论】:

我看不出GROUP BY 的意义,请显示示例数据和预期输出以使您的问题更清楚。 Deutsche Fehlermeldungen bedeuten nichts für englische Leser。 archiveZBEW.PROD.sFCTS_G195.NETTOBETRAG 列在选择列表中无效,因为它不包含在聚合函数中,也不包含在 GROUP BY 子句中。顺便说一句,我什至不会说德语。 【参考方案1】:

将 SUM()OVER() 与 GROUP BY 结合使用没有具体问题,但您可能对与 OVER 相关的 SUM() 的存在感到困惑,并忘记它只是另一个需要的列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

【讨论】:

【参考方案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')

【讨论】:

【参考方案3】:

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

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

【讨论】:

以上是关于T-SQL-Sum over Partition by 与 group by 组合的主要内容,如果未能解决你的问题,请参考以下文章

oracle下的OVER(PARTITION BY)函数介绍

在 OVER(PARTITION BY) 中使用 CTE

如何使用“OVER(PARTITION BY ...)”来区分[关闭]

MySQL 语法中 OVER 和 PARTITION 的语法错误

SQL 聚合 OVER 和 PARTITION

Hive sum over partition preceding following 累计求和