SQL Pivot查询基于"列的SUM除以另一列的SUM"

时间:2015-02-13 06:54:37

标签: sql-server pivot

我试图弄清楚如何根据特定列的SUM除以另一列的SUM来转移我的数据“。这是我到目前为止的地方,但PIVOT查询给了我错误:< / p>

USE MyDatabase

SELECT  [PropertyCode],
        [Market],
        [JANUARY 2015],
        [FEBRUARY 2015],
        [MARCH 2015]

FROM (SELECT [PropertyCode],
             [Market],  
             [MTH],
             [GN],
             [PkgRev]


     FROM   HOLDINGS

     ) a

 PIVOT (Sum([PkgRev])/Sum([GN])
         FOR [MTH] IN ([JANUARY 2015],
                   [FEBRUARY 2015],
                   [MARCH 2015])) as pvttable

ORDER BY [PROPERTYCODE]

上面查询中的HOLDINGS是一个VIEW表,PkgRev和GN是该VIEW表中的列。我需要我的Pivot查询在执行由GN列的SUM分割的PkgRev列的SUM之后返回值。

以下是数据样本(来自HOLDINGS视图表):

PropertyCode    ID  GN  MTH    Pkg Rev  Market
   A            1   10  Jan-15  95,652  United Kingdom
   A            3   20  Jan-15  95,652  United Kingdom
   A            12  24  Feb-15  81,610  France
   A            15  14  Feb-15  47,606  France
   B            16  18  Jan-15  38,153  France
   B            20  28  Feb-15  69,391  United Kingdom
   B            22  32  Jan-15  107,990 Germany
   B            25  28  Feb-15  76,696  United Kingdom
   C            26  4   Jan-15  18,961  Germany
   C            27  26  Jan-15  56,522  South Africa
   C            29  20  Feb-15  27,826  India
   C            31  18  Jan-15  33,661  France
   C            32  14  Jan-15  26,039  Germany

预期产出如下:

PropertyCode    Market           Jan-15     Feb-15
     A          France             0         3,400
     A          United Kingdom     6,377       0
     B          France             2,120       0
     B          Germany            3,375       0
     B          United Kingdom     0         2,609
     C          France             1,870       0
     C          Germany            1,607       0
     C          India              0         1,391
     C          South Africa       2,174       0

1 个答案:

答案 0 :(得分:0)

转动时你应该记住: 1:aggregation and spreading elements cannot directly be results of expressions 2:分组元素为identified by elimination

我建议你改写如下:

DECLARE @t TABLE
    (
      ProperTyCode CHAR(1) ,
      ID INT ,
      GN int ,
      MTH NVARCHAR(10) ,
      Pkg int ,
      Market NVARCHAR(20)
    )

INSERT  INTO @t
VALUES  ( 'A', 1, 10, 'Jan-15', 95652, 'United Kingdom' ),
        ( 'A', 3, 20, 'Jan-15', 95652, 'United Kingdom' ),
        ( 'A', 12, 24, 'Feb-15', 81610, 'France' ),
        ( 'A', 15, 14, 'Feb-15', 47606, 'France' ),
        ( 'B', 16, 18, 'Jan-15', 38153, 'France' ),
        ( 'B', 20, 28, 'Feb-15', 69391, 'United Kingdom' ),
        ( 'B', 22, 32, 'Jan-15', 107990, 'Germany' ),
        ( 'B', 25, 28, 'Feb-15', 76696, 'United Kingdom' ),
        ( 'C', 26, 4, 'Jan-15', 18961, 'Germany' ),
        ( 'C', 27, 26, 'Jan-15', 56522, 'South Africa' ),
        ( 'C', 29, 20, 'Feb-15', 27826, 'India' ),
        ( 'C', 31, 18, 'Jan-15', 33661, 'France' ),
        ( 'C', 32, 14, 'Jan-15', 26039, 'Germany' );
WITH    cte
          AS ( SELECT   [PropertyCode] ,
                        [Market] ,
                        [MTH] ,
                        CAST(ROUND(SUM([Pkg])  / CAST(SUM([GN]) AS DECIMAL(20, 5)), 0) AS INT) AS [GR]
               FROM     @t
               GROUP BY [PropertyCode] ,
                        [Market] ,
                        [MTH]
             )
    SELECT  [PropertyCode] ,
            [Market] ,
            ISNULL([Jan-15], 0) AS [Jan-15],
            ISNULL([Feb-15], 0) AS [Feb-15]
    FROM    cte PIVOT ( MAX([GR]) FOR [MTH] IN ( [Jan-15], [Feb-15] ) ) AS pvttable
    ORDER BY [PROPERTYCODE]

输出:

PropertyCode    Market          Jan-15  Feb-15
A               France          0       3400
A               United Kingdom  6377    0
B               France          2120    0
B               Germany         3375    0
B               United Kingdom  0       2609
C               France          1870    0
C               Germany         2500    0
C               India           0       1391
C               South Africa    2174    0