我想取消显示如下数据集:
对此:
+-------------+-----------------+---------+
| 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;
有人可以帮我吗?我不知道如何编码,只是开始。 预先感谢!
答案 0 :(得分:1)
您可以使用VALUES
:
SELECT T.scenarioId, s.*
FROM tab t
CROSS APPLY (VALUES ('Number1', t.Number1),
('Number2', t.Number2)) AS s(DistId, Val)
答案 1 :(得分:1)
我为此使用cross apply
select t.scenarioid, v.*
from t cross apply
(values ('Number1', number1), ('Number2', number2), . . .
) v(distributionId, number);
您需要列出所有数字。
为什么我更喜欢cross apply
而不是unpivot
?我发现unpivot
语法非常具体。它几乎只做一件事。另一方面,apply
引入了横向联接。这些功能非常强大,apply
可以在许多不同的情况下使用。
答案 2 :(得分:1)
我会使用apply
:
select t.scenarioid, tt.distributionId, tt.value
from table t cross apply
( values (Number1, 'Number1'), (Number2, 'Number2'), . . .
) tt (value, distributionId);
是的,您只需要第一次列出所有可能的Numbers
。
答案 3 :(得分:1)
如果您需要动态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)
结果: