2016-04-14 2 views
2

я следующее:SQL Преобразование нескольких строк в нескольких столбцах

DECLARE @tmp TABLE (cid int, pid int, name varchar(10)) 

Insert Into @tmp (cid, pid, name) 
Select 31, 18, 'Pot_One' UNION ALL 
Select 32, 18, 'Pot_One' UNION ALL 
Select 31, 19, 'Pot_Two' UNION ALL 
Select 32, 19, 'Pot_Two' UNION ALL 
Select 33, 19, 'Pot_Two' UNION ALL 
Select 40, 20, 'Pot_Three' 

Это описывает несколько Сида становятся вместе, чтобы создать банк, например, 31 и 32 находятся в банке один и горшок ID для него 18, мы можем получить любое количество cid в банке (минимум 1 и не больше)

То, что я пытаюсь достичь, - это получить горшки и соответствующие циклы в ряд, поэтому я подумал об использовании поворота и попробовал это:

SELECT * from 
(
    select cid, pid, name 
    from @tmp 
) x 
pivot 
(
    min(cid) 
    for pid in ([18],[19],[20]) 
) p 

Но это возвращает:

name   18  19  20 
Pot_One  31  NULL NULL 
Pot_Three NULL NULL 40 
Pot_Two  NULL 31  NULL 

То не так, потому что банк один имеет 31 и 32 в нем, и это представляет только 31, что мне нужно, это потенциально:

name   18  18  19 19 19 20 
Pot_One  31  32  NULL NULL NULL NULL 
Pot_Three NULL NULL NULL NULL NULL 40 
Pot_Two  NULL NULL 31 32 33 NULL 

Я изменил стержень чтобы получить Сиду как заголовки столбцов и получил это, более ближе к тому, что я пытаюсь достичь:

SELECT * from 
(
    select cid, pid, name 
    from @tmp 
) x 
pivot 
(
    min(pid) 
    for cid in ([31],[32],[33],[40]) 
) p 

name  31 32  33 40 
Pot_One  18 18  NULL NULL 
Pot_Three NULL NULL  NULL 20 
Pot_Two  19 19  19 NULL 

Я попробовал несколько различных способов без успеха, есть ли другие способ достижения этого?

Благодаря

+0

Что вы хотите, чтобы вывод выглядеть? –

+0

Это выглядит немного сложнее, но также очень интересно. Можете ли вы предоставить желаемый результат? –

+0

Спасибо, что посмотрели. Мне нужно, чтобы иметь возможность отображать как-то cid 31 и 32 в горшке 18, а cid 31,32 и 33 находится в горшке 19, а cid 40 находится в капоте 20. – 03Usr

ответ

1

Это альтернативное решение.

В основном имя банка и имя банка - это два имени для одной и той же вещи, они не меняются, поэтому в основном 18 (Pot_One) должен быть достаточно хорошим индикатором для одной и той же вещи, а затем вы можете создать две карты D между этим индикатором и значениями cid до показать, если они в ней или не нравится ниже

SELECT * from 
(
    select cid, cast(pid as varchar) +' ('+ name +')' as name, 1 r 
    from @tmp 
) x 
pivot 
(
    min(r) 
    for cid in ([31],[32],[33],[40]) 
) p 

Выход:

name   31   32   33   40 
-------------------------- ----------- ----------- ----------- 
18 (Pot_One) 1   1   NULL  NULL 
19 (Pot_Two) 1   1   1   NULL 
20 (Pot_Three) NULL  NULL  NULL  1 

более вы можете заменить NULL с Say «X», изменяя, как показано ниже

SELECT name, ISNULL([31], 'x') [31],ISNULL([32],'x') [32],ISNULL([33],'x') [33],ISNULL([40],'x') [40] 
from 
(
    select cid, cast(pid as varchar) +' ('+ name +')' as name, '1' r 
    from @tmp 
) x 
pivot 
(
    min(r) 
    for cid in ([31],[32],[33],[40]) 
) p 

выход

name   31 32 33 40 
--------------- ---- ---- ---- ---- 
18 (Pot_One) 1 1 x x 
19 (Pot_Two) 1 1 1 x 
20 (Pot_Three) x x x 1 
1

проблема заключается в мин (ИДС) в стержне, он не даст вам все записи. Переключается на поворот pid, давая несколько результатов cid. Subqueried this и заменил значения значением cid, где результат не равен NULL.

DECLARE @tmp TABLE (cid int, pid int, name varchar(10)) 

Insert Into @tmp (cid, pid, name) 
Select 31, 18, 'Pot_One' UNION ALL 
Select 32, 18, 'Pot_One' UNION ALL 
Select 31, 19, 'Pot_Two' UNION ALL 
Select 32, 19, 'Pot_Two' UNION ALL 
Select 33, 19, 'Pot_Two' UNION ALL 
Select 40, 20, 'Pot_Three' 

SELECT name, CASE WHEN [18] IS NOT NULL THEN CID END AS [18], CASE WHEN [19] IS NOT NULL THEN CID END AS [19], CASE WHEN [20] IS NOT NULL THEN CID END AS [20] 
FROM 
(
SELECT * from 
(
    select cid, pid, name 
    from @tmp 
) x 
pivot 
(
    min(pid) 
    for pid in ([18],[19],[20]) 
) p 
) x 
Смежные вопросы