SQL Server: как преобразовать столбец в одну строку? - PullRequest
0 голосов
/ 05 ноября 2011

У меня есть один столбец с разными значениями в зависимости от результата.Я хотел бы вернуть одну строку с исправленными столбцами.

Вывод столбца выглядит следующим образом:

Group | Item
--------------
  G1  | 1
  G1  | 2
  G2  | 3

Я хотел бы вывести как:

Group | Item1 | Item2 | Item3
-----------------------------
  G1  |   1   |   2   | N/A
  G2  |   3   |  N/A  | N/A

..

Заранее спасибо ...

Ответы [ 3 ]

3 голосов
/ 05 ноября 2011

Поскольку в каждой группе может быть максимум три элемента, я бы использовал оператор PIVOT :

DECLARE @Test TABLE
(
     RowID  INT IDENTITY(1,1) PRIMARY KEY
    ,[Group]VARCHAR(10) NOT NULL
    ,Item   INT NOT NULL
    ,UNIQUE ([Group], Item)
);  
INSERT  @Test   VALUES ('G1', 1);
INSERT  @Test   VALUES ('G1', 2);
INSERT  @Test   VALUES ('G2', 3);

WITH PivotSource
AS
(
    SELECT   t.[Group], t.Item
            ,ROW_NUMBER() OVER(PARTITION BY t.[Group] ORDER BY t.RowID) RowNumber
    FROM    @Test t

)
SELECT   pvt.[Group]
        ,Item1 = ISNULL( CONVERT(VARCHAR(11), pvt.[1]) , 'N/A')
        ,Item2 = ISNULL( CONVERT(VARCHAR(11), pvt.[2]) , 'N/A')
        ,Item3 = ISNULL( CONVERT(VARCHAR(11), pvt.[3]) , 'N/A')
FROM    PivotSource src
PIVOT   ( MAX(src.Item) FOR src.RowNumber IN ([1], [2], [3]) ) pvt;

Результаты:

Group      Item1       Item2       Item3
---------- ----------- ----------- -----------
G1         1           2           N/A
G2         3           N/A         N/A
1 голос
/ 05 ноября 2011

Я думаю, что-то вроде этого будет работать:

SELECT t1.[Group], t1.Item, t2.Item, t3.Item
from tbl t1, tbl t2, tbl t3
where t1.[Group] = t2.[Group] and t1.[Group] = t3.[Group]
    and t1.Item < t2.Item and t2.Item < t3.Item
    and t1.[Group] in (select [Group] from tbl group by [Group] having COUNT(*) = 3)
union
SELECT t1.[Group], t1.Item, t2.Item, NULL
from tbl t1, tbl t2
where t1.[Group] = t2.[Group]
    and t1.Item < t2.Item
    and t1.[Group] in 
    (select [Group] from tbl group by [Group] having COUNT(*) = 2)
union
select tbl.[Group], tbl.Item, NULL, NULL
from tbl
where [Group] in (select [Group] from tbl group by [Group] having COUNT(*) = 1)
0 голосов
/ 05 ноября 2011

Поскольку у вас есть фиксированное количество выходных столбцов, вы можете сделать несколько трюков с ROW_NUMBER() и over (partition by ... order by ...).

select child1.[Group], child1.Item as Item1, child2.Item as Item2, child3.Item as Item3 from 
(select [Group], Item from 
    (select  [Group], Item, (ROW_NUMBER() over(partition by [group] order by item)) as rownum from GroupTable) as child1_inner
    where child1_inner.rownum = 1) as child1
left outer join 
(select [Group], Item from 
    (select  [Group], Item, (ROW_NUMBER() over(partition by [group] order by item)) as rownum from GroupTable) as child2_inner
    where child2_inner.rownum = 2) as child2
on child1.[Group] = child2.[Group]
left outer join 
(select [Group], Item from 
    (select  [Group], Item, (ROW_NUMBER() over(partition by [group] order by item)) as rownum from GroupTable) as child3_inner
    where child3_inner.rownum = 3) as child3
on child1.[Group] = child3.[Group]

Это возвращает null вместо N/A, но это можно исправить с помощью COALESCE.

...