[英]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.