如何为此创建数据透视查询?
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 以供参考。
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)
我需要这样的输出。
在此不限形状;例如:[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 以供参考。
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)