簡體   English   中英

SQL Server Management Studio - 對n列,n行的UNPIVOT查詢

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM