[英]SQL Server Management Studio - UNPIVOT Query for n columns, n rows
我想取消一個看起來像這樣的數據集:
對此:
+-------------+-----------------+---------+
| Scenario ID | Distribution ID | Value |
+-------------+-----------------+---------+
| 0 | Number1 | 10 |
| 0 | Number2 | 19 |
| 0 | Number3 | 34.3 |
| 0 | Number4 | 60.31 |
| 0 | Number5 | 104.527 |
+-------------+-----------------+---------+
使用SQL System Management Studio。
我想我應該使用基於這樣的代碼:
SELECT *
FROM
(
SELECT 1
FROM table_name
) AS cp
UNPIVOT
(
Scenario FOR Scenarios IN (*
) AS up;
誰能幫我這個? 我不知道如何編碼,只是開始。 提前致謝!
你可以使用VALUES
:
SELECT T.scenarioId, s.*
FROM tab t
CROSS APPLY (VALUES ('Number1', t.Number1),
('Number2', t.Number2)) AS s(DistId, Val)
我用cross apply
:
select t.scenarioid, v.*
from t cross apply
(values ('Number1', number1), ('Number2', number2), . . .
) v(distributionId, number);
你需要列出所有數字。
為什么我更喜歡cross apply
不是unpivot
? 我發現unpivot
語法非常具體。 它幾乎完成了一件事。 另一方面, apply
引入了橫向連接。 這些都是非常強大的,並apply
可以在許多不同的情況下使用。
我會用apply
:
select t.scenarioid, tt.distributionId, tt.value
from table t cross apply
( values (Number1, 'Number1'), (Number2, 'Number2'), . . .
) tt (value, distributionId);
是的,您需要第一次列出所有可能的Numbers
。
如果您需要動態的unpivot
解決方案(可以處理任意數量的列),請嘗試以下方法:
create table [dbo].[Test] ([ScenarioID] int, [Number1] decimal(10,3),
[Number2] decimal(10,3), [Number3] decimal(10,3),
[Number4] decimal(10,3), [Number5] decimal(10,3))
insert into [dbo].[Test] select 0, 10, 19, 34.3, 60.31, 104.527
declare @sql nvarchar(max) = ''
declare @cols nvarchar(max) = ''
select @cols = @cols +','+ QUOTENAME(COLUMN_NAME)
from INFORMATION_SCHEMA.COLUMNS
where TABLE_SCHEMA='dbo' and TABLE_NAME='test' and COLUMN_NAME like 'Number%'
order by ORDINAL_POSITION
set @cols = substring(@cols, 2, LEN(@cols))
set @sql = @sql + ' select u.[ScenarioID], u.[DistributionID], u.[Value]
from [dbo].[Test] s
unpivot
(
[Value]
for [DistributionID] in ('+ @cols + ')
) u;'
execute(@sql)
結果:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.