SQL Server:SUM()与Row_number() - 所有记录与行#1的总和

时间:2018-02-14 03:10:19

标签: sql sql-server tsql

我试图将所有row_number = 1加起来,但我希望它包含所有其他行,但只显示row_number 1的记录,但是将所有其他行相加。

SELECT 
    A.TEST, A.BLOCK, A.POLICY, A.SAL_COVERAGE,
    A.YEAR, A.ZIP, A.COVERAGE,
    SUM(A.WP) AS WP,
    SUM(A.WE) AS WE,
    SUM(A.EP) AS EP,
    SUM(A.EE) AS EE
FROM
    (SELECT
         ROW_NUMBER() OVER(PARTITION BY ZIP ORDER BY ZIP) AS TEST,
         BLOCK, POLICY, SAL_COVERAGE,
         YEAR, ZIP, COVERAGE,
         SUM(WP) AS WP,
         SUM(WE) AS WE,
         SUM(EP) AS EP,
         SUM(EE) AS EE
     FROM 
         [Reports].[dbo].[DGTESTING]
     GROUP BY
         BLOCK, POLICY, SAL_COVERAGE, YEAR, ZIP, COVERAGE) AS A
WHERE 
    TEST = 1
    AND A.POLICY = 'XXXX'
GROUP BY
    A.TEST, A.BLOCK, A.POLICY, A.SAL_COVERAGE, A.YEAR, A.ZIP, A.COVERAGE

我得到的结果是这样的:

enter image description here

我希望每个ZIP都能汇总到这条记录中,但我只得到1.看起来SQL正在做的一切都是正确的,但我错过了一种方法来做我想要的事情。

示例数据

--------------------------------------------------------------------------------------
|TEST|BLK|POL |SAL|YEAR|ZIP   |COV  |WP  |WE        |EP    |EE
--------------------------------------------------------------------------------------
|1   |1  |XXX |1  |2014|96003 |Bod  |-143|-10.888157|-87.59|-6.67
--------------------------------------------------------------------------------------
|32  |6  |XXX |1  |2015|96007 |Bod  |0   |0         |-55.41|-4.21
--------------------------------------------------------------------------------------

预期数据

-------------------------------------------------------------------------------------
|TEST|BLK|POL|SAL|YEAR|ZIP  |COV|WP  |WE        |EP  |EE
--------------------------------------------------------------------------------------
|1   |  1|XXX|  1|2014|96003|Bod|-143|-10.888157|-143|-10.88
------------------------------------------------------------------------------------

这是更多数据

More Date

1 个答案:

答案 0 :(得分:0)

下面的查询将为整个表返回一行,就像问题中的预期结果一样。它将返回具有最小ZIP值的一行。

SUM(...) OVER()对每一行的整个表进行求和。然后我们只选择一行rn=1。首先运行内部查询以了解它的作用。

SELECT 
    A.TEST
    ,A.BLOCK
    ,A.POLICY
    ,A.SAL_COVERAGE
    ,A.YEAR
    ,A.ZIP
    ,A.COVERAGE
    ,A.WP
    ,A.WE
    ,A.EP
    ,A.EE
FROM
    (
        SELECT
            ROW_NUMBER() OVER (ORDER BY ZIP) AS rn
            ,BLOCK
            ,POLICY
            ,SAL_COVERAGE
            ,YEAR
            ,ZIP
            ,COVERAGE
            ,SUM(WP) OVER() AS WP
            ,SUM(WE) OVER() AS WE
            ,SUM(EP) OVER() AS EP
            ,SUM(EE) OVER() AS EE
        FROM [Reports].[dbo].[DGTESTING]
    ) AS A
WHERE 
    rn = 1
;