如何为此创建Pivot查询?

时间:2015-05-08 05:13:32

标签: sql sql-server sql-server-2008 pivot-table powerpivot

我需要这样的输出。

enter image description here

在这种无限制的形状;例如:[RD],[PC],[EM],[SE],[PR],[CM]

我的数据如下:

POINTER_RANGE  SHAPE_NAME   PCS   CTS     VALUE
0.30-0.39       RD           6   1.826   3503.17
0.40-0.49       RD           3   1.238   2837.62
0.50-0.69       PR           1   0.504    776.16
0.50-0.69       RD           5   2.618   8639.58
0.70-0.89       PC           5   4.109  14278.41
0.70-0.89       RD           6   4.490  17335.04
0.90-0.99       RD           2   1.803   5860.92
1.00-1.49       PC           3   3.039   9515.10
1.00-1.49       RD           7   7.807  56716.18
1.50-1.99       EM           2   3.203  17080.48
1.50-1.99       RD           3   4.950  32516.03
2.00-2.99       EM           2   4.528  27155.22
2.00-2.99       RD          34  75.462 703583.44
3.00-3.99       CM           1   3.024  23194.08
3.00-3.99       RD           7  21.138 329701.25
3.00-3.99       SE           1   3.212  26980.80

DYNAMIC PIVOT QUERY .

在SQL中,获得这样的结果会很好。

[POINTER]  [RD_PCS] [RD_CTS] [RD_VAL]  [EM_PCS] [EM_CTS] [EM_VAL] [....]
0.30-0.39     1       1.20    5000.00
2.00-2.99     5       5.30   10000.00     5       6.30   5000.00 
    :        
    :
3.00-3.99                                 2        2.50  200.00                                         

我只是解释一下这种要求的类型。这对我来说太复杂了。 我无法为此编写查询,这对我的报告方面非常重要。

1 个答案:

答案 0 :(得分:1)

您可以使用动态交叉表来实现此目的。请阅读Jeff Moden的article作为参考。

SQL Fiddle

DECLARE @sql1 VARCHAR(4000) = ''
DECLARE @sql2 VARCHAR(4000) = ''
DECLARE @sql3 VARCHAR(4000) = ''

SELECT @sql1 = 
'SELECT
      [POINTER] = POINTER_RANGE' + CHAR(10)

SELECT @sql2 = @sql2 +
'   , [' + SHAPE_NAME + '_CTS] = MAX(CASE WHEN SHAPE_NAME =''' + SHAPE_NAME + ''' THEN CTS END)' + CHAR(10) +
'   , [' + SHAPE_NAME + '_PCS] = MAX(CASE WHEN SHAPE_NAME =''' + SHAPE_NAME + ''' THEN PCS END)' + CHAR(10) +
'   , [' + SHAPE_NAME + '_VAL] = MAX(CASE WHEN SHAPE_NAME =''' + SHAPE_NAME + ''' THEN VALUE END)' + CHAR(10)
FROM(
    SELECT DISTINCT SHAPE_NAME FROM TestData
)t
ORDER BY SHAPE_NAME

SELECT @sql3 =
'FROM TestData
GROUP BY POINTER_RANGE
ORDER BY POINTER_RANGE'

PRINT (@sql1 + @sql2 + @sql3)
EXEC (@sql1 + @sql2 + @sql3)