T-SQL для изменения данных из одной таблицы и вставки в другую таблицу - PullRequest
1 голос
/ 16 июля 2010

Моя базовая таблица выглядит так:

ColumnA|ColumnB
---------------
   A   |  C1
   A   |  C2
   A   |  C3
   B   |  C1
   B   |  C3
   C   |  C4

Я хочу прочитать записи из базовой таблицы и записать их в таблицу ниже:

ColumnA | C1 | C2 | C3 | C4
----------------------------
   A    | Y  |  Y | Y  | N
   B    | Y  |  N | Y  | N
   C    | N  |  N | N  | Y

Я не хочу использовать курсор, но я не знаю, возможно ли это или нет.

Спасибо

Ответы [ 3 ]

2 голосов
/ 16 июля 2010

Посмотрите на команду PIVOT .Оттуда вы можете сделать INSERT INTO ... SELECT ...

SELECT ColumnA, [C1], [C2], [C3], [C4]
 FROM (SELECT * FROM table) t 
PIVOT
(
 Count(ColumnB)
 FOR ColumnB IN ([C1], [C2], [C3], [C4])
) As Pvt 
1 голос
/ 16 июля 2010

Один (обычно быстрый) путь будет group by:

insert  NewTable (ColumnA, C1, C2, C3, C4)
select  ColumnA
,       IsNull(max(case when ColumnB = 'C1' then 'Y' end), 'N')
,       IsNull(max(case when ColumnB = 'C2' then 'Y' end), 'N')
,       IsNull(max(case when ColumnB = 'C3' then 'Y' end), 'N')
,       IsNull(max(case when ColumnB = 'C4' then 'Y' end), 'N')
from    OldTable
group by
        ColumnA

Другой способ - это подзапросы, например:

insert  NewTable (ColumnA, C1, C2, C3, C4)
select  src.ColumnA
,       case when exists (select * from OldTable ot 
                          where ot.ColumnA = src.ColumnA and ot.ColumnB = 'C1') 
                  then 'Y' else 'N' end
,       case when exists (select * from OldTable ot 
                          where ot.ColumnA = src.ColumnA and ot.ColumnB = 'C2') 
                  then 'Y' else 'N' end
,       case when exists (select * from OldTable ot 
                          where ot.ColumnA = src.ColumnA and ot.ColumnB = 'C3') 
                  then 'Y' else 'N' end
,       case when exists (select * from OldTable ot 
                          where ot.ColumnA = src.ColumnA and ot.ColumnB = 'C4') 
                  then 'Y' else 'N' end
from    (
        select  distinct ColumnA
        from    OldTable
        ) src

Или, адаптированные из ответа Криса Дайвера, с pivot:

select  ColumnA
,       case when C1 > 0 then 'Y' else 'N' end C1
,       case when C2 > 0 then 'Y' else 'N' end C2
,       case when C3 > 0 then 'Y' else 'N' end C3
,       case when C4 > 0 then 'Y' else 'N' end C4
from    OldTable src
pivot   (
        count(ColumnB)
        for ColumnB IN ([C1], [C2], [C3], [C4])
        ) pvt
0 голосов
/ 16 июля 2010

при условии, что вы можете ВЫБРАТЬ информацию, которая вам нравится, тогда вы можете записать вставку в результате этого выбора.

...