【问题标题】:SQL Pivot query based on "SUM of a column divided by SUM of another column"基于“一列的总和除以另一列的总和”的 SQL Pivot 查询
【发布时间】:2015-02-13 18:29:39
【问题描述】:

我试图弄清楚如何根据特定列的总和除以另一列的总和来旋转我的数据”。这是我到目前为止到达的地方,但 PIVOT 查询给了我错误:

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 表中的列。在执行 PkgRev 列的 SUM 除以 GN 列的 SUM 后,我需要我的 Pivot 查询返回值。

以下是数据示例(来自 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

【问题讨论】:

  • 能否提供一些示例数据和预期结果
  • 我刚刚用预期的输出更新了帖子。谢谢。
  • 还添加了一些示例数据。

标签: sql-server pivot


【解决方案1】:

旋转时,您应该记住: 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    

【讨论】:

  • 谢谢。你的解决方案我快到了。我必须将 [GN] 添加到 GROUP BY 语句中。然而,输出不是我所追求的,因为它没有按市场进行适当的分组。我有几行相同的财产和相同的市场。是那个 [GN] 变量导致了这个吗?
  • @user3115933,为我们提供样本数据和所需的输出。没有样本数据,很难理解您需要什么。
  • 刚刚用一些示例数据和预期的输出更新了我的帖子。再次感谢!
  • 谢谢乔治。可能是我用 Pkg 数字中的逗号误导了你。它们不是十进制的。 95652代表九万五千六百五十二!无论如何,我会用你的新代码再次测试。
  • @user3115933,再检查一遍
猜你喜欢
  • 1970-01-01
  • 2019-11-23
  • 2014-05-11
  • 2019-10-15
  • 1970-01-01
  • 2017-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多