SQL Server Management Studio-UNPIVOT查询n列n行

时间:2018-10-10 14:46:52

标签: sql sql-server tsql

我想取消显示如下数据集:

enter image description here

对此:

+-------------+-----------------+---------+
| 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;

有人可以帮我吗?我不知道如何编码,只是开始。 预先感谢!

4 个答案:

答案 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)

结果:

enter image description here