Как вставить новые строки на основе значений в других столбцах на сервере SQL? - PullRequest
0 голосов
/ 14 мая 2019

У меня есть набор данных, как показано ниже:

Id   A14_Comment   A15_Comment   A16_Comment
1    Comment1       null           null
2    Comment2       Comment3       Comment4
3    null           Comment5       Comment6
4    null           null           Comment7

Что мне нужно сделать, это получить вывод ниже:

Id   A14_Comment   A15_Comment   A16_Comment   Code
1     Comment1       null           null        A14
2     Comment2       Comment3       Comment4    A14
2     Comment2       Comment3       Comment4    A15
2     Comment2       Comment3       Comment4    A16
3     null           Comment5       Comment6    A15
3     null           Comment5       Comment6    A16
4     null           null           Comment7    A16

Как видно, моя цель - добавить столбец Code и дублировать строки, помечая код. Приведенный ниже запрос показывает, сколько раз мне нужно добавить строку с различным кодом для каждой строки, но не смог найти эффективный способ сделать все остальное.

select Id, (
                select count(*)
                from (values (T.A14_Comment), (T.A15_Comment), (T.A16_Comment)) as v(col)
                where v.col is not null and v.col <> ''
           )    from #Comments as T

Любая помощь будет оценена.

Ответы [ 3 ]

2 голосов
/ 15 мая 2019

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

select c.*, c.code
from #Comments c cross apply
     (select c.code
      from (values (c.A14_Comment, 'A14'), (c.A15_Comment, 'A15'), (c.A16_Comment, 'A16')
           ) v(col, code)
      where col is not null
     ) c;

Подзапрос на самом деле не нужен.Вы можете найти это проще:

select c.*, v.code
from #Comments c cross apply
     (values (c.A14_Comment, 'A14'), (c.A15_Comment, 'A15'), (c.A16_Comment, 'A16')
     ) v(col, code)
where v.col is not null
1 голос
/ 14 мая 2019

При соединении таблицы с CTE:

with 
  codes as (
    select 'A14' code
    union all
    select 'A15'
    union all
    select 'A16'
  ), 
  idcodes as (
    select comments.id, codes.code
    from comments cross join codes
  )

select * 
from comments c inner join idcodes i
on 
  c.id = i.id
  and (
    c.A14_Comment is not null and i.code = 'A14'
    or
    c.A15_Comment is not null and i.code = 'A15' 
    or
    c.A16_Comment is not null and i.code = 'A16' 
  )

См. Демоверсию .Результаты:

> Id | A14_Comment | A15_Comment | A16_Comment | code
> -: | :---------- | :---------- | :---------- | :---
>  1 | Comment1    | null        | null        | A14 
>  2 | Comment2    | Comment3    | Comment4    | A14 
>  2 | Comment2    | Comment3    | Comment4    | A15 
>  2 | Comment2    | Comment3    | Comment4    | A16 
>  3 | null        | Comment5    | Comment6    | A15 
>  3 | null        | Comment5    | Comment6    | A16 
>  4 | null        | null        | Comment7    | A16 
0 голосов
/ 14 мая 2019

Следующий запрос даст ожидаемый результат: -

select * From (
select *,'A14' Code from #Comments where A14_Comment is not null union all
select *,'A15' Code from #Comments where A15_Comment is not null union all
select *,'A16' Code from #Comments where A16_Comment is not null) as xData order by ID,Code


ID  A14_Comment A15_Comment A16_Comment Code
1   Comment1    NULL        NULL        A14
2   Comment2    Comment3    Comment4    A14
2   Comment2    Comment3    Comment4    A15
2   Comment2    Comment3    Comment4    A16
3   NULL        Comment5    Comment6    A15
3   NULL        Comment5    Comment6    A16
4   NULL        NULL        Comment7    A16
...