SQL Server Management Studio - запрос UNPIVOT для n столбцов, n строк - PullRequest
0 голосов
/ 10 октября 2018

Я хотел отключить набор данных, который выглядит следующим образом:

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 голосов
/ 10 октября 2018

Если вам нужно динамическое решение 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

0 голосов
/ 10 октября 2018

Я использую cross apply для этого:

select t.scenarioid, v.*
from t cross apply
     (values ('Number1', number1), ('Number2', number2), . . . 
     ) v(distributionId, number);

Вам нужно перечислить все числа.

Почему я предпочитаю cross apply вместо unpivot?Я нахожу синтаксис unpivot очень специфичным .Это в значительной степени делает одну вещь.С другой стороны, apply вводит боковые соединения.Они очень мощные, и apply можно использовать в самых разных ситуациях.

0 голосов
/ 10 октября 2018

Я бы использовал apply:

select t.scenarioid, tt.distributionId, tt.value
from table t cross apply
     ( values (Number1, 'Number1'), (Number2, 'Number2'), . . .   
     ) tt (value, distributionId);

Да, вам нужно перечислить все возможные Numbers только в первый раз.

0 голосов
/ 10 октября 2018

Вы можете использовать VALUES:

SELECT T.scenarioId, s.*
FROM tab t
CROSS APPLY (VALUES ('Number1', t.Number1),
                    ('Number2', t.Number2)) AS s(DistId, Val)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...