如何为此创建数据透视查询?

how to create Pivot query for this?

我需要这样的输出。

在此不限形状;例如:[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                                         

我只是解释一下这个是什么类型的需求。这对我来说太复杂了。 我不能为此编写查询,这在我的报告方面对我来说非常重要。

您可以使用动态交叉表来实现这一点。阅读 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)