Динамический выбор имени столбца в MSSQL - PullRequest
0 голосов
/ 07 ноября 2018

Я хочу выбрать Имя столбца , которое имеет ненулевое и ненулевое значение. Поэтому любое имя столбца , имеющее 0 или NULL, не должно отображаться в выходной сетке

У меня есть исходная таблица, как показано ниже

col1    col2    col3    col4    col5D   Col6D   Col7D   Col8D

Abc     0       1       John    0       0       0       0       
Abc     1       2       John    1       0       0       0
Abc     2       3       John    0       0       0       0
Abc     3       4       John    0       1       0       0
Xyz     0       1       Ron     0       0       0       0       
Xyz     1       2       Ron     0       0       0       0
Xyz     2       3       Ron     0       0       1       0
Xyz     3       4       Ron     0       0       0       0

Я хочу сгруппировать по Col1 и отобразить Col1, MIN(Col2), MIN(Col3), MIN(Col4) и ColRes как (Имя столбца со значением больше 0)

Ожидаемый результат, как показано ниже :

   col1     col2    col3    col4    ColRes  

    Abc     1       2       John    Col5D
    Abc     3       4       John    Col6D
    Xyz     2       3       Ron     Col7D

Возможно ли это?

Ответы [ 2 ]

0 голосов
/ 07 ноября 2018

Ваш вопрос о GROUP-BY & OUTPUT result сбивает с толку. B'cz GROUP-BY слится Результат Row-1 & 2 .

Но для вашего лучшего результата вы можете попробовать следующие вопросы для гарантии.

Создать определение таблицы

Create table Table1
(
  col1 varchar(10),
  col2  int,
  col3 int,
  col4 varchar(10),
  col5D int,
  col6D int,
  col7D int,
  col8D int
)
GO
insert into Table1
values('Abc',0,1,'John',0,0,0,0)       
GO
insert into Table1
values('Abc',1,2,'John',1,0,0,0)
GO
insert into Table1
values('Abc',2,3,'John',0,0,0,0)
GO
insert into Table1
values('Abc',3,4,'John',0,1,0,0)
GO
insert into Table1
values('Xyz',0,1,'Ron',0,0,0,0)       
GO
insert into Table1
values('Xyz',1,2,'Ron',0,0,0,0)
GO
insert into Table1
values('Xyz',2,3,'Ron',0,0,1,0)
GO
insert into Table1
values('Xyz',3,4,'Ron',0,0,0,0)

Результат ① → Как показано в Ожидаемый результат , вам следует попробовать этот запрос.

SELECT
    COL1, COL2, COL3, COL4,
    CASE 
            WHEN ISNULL(COL5D,0) > 0 THEN 'COL5D'
            WHEN ISNULL(COL6D,0) > 0 THEN 'COL6D'
            WHEN ISNULL(COL7D,0) > 0 THEN 'COL7D'
            WHEN ISNULL(COL8D,0) > 0 THEN 'COL8D' END
     As ColRes
FROM TABLE1
WHERE ISNULL(COL5D,0) > 0 OR ISNULL(COL6D,0) > 0 OR ISNULL(COL7D,0) > 0 OR ISNULL(COL8D,0) > 0

Тогда вывод будет: (избегайте использования GROUP-BY)

enter image description here

Результат ② → Как показано в Вопрос для использования GROUP-BY, тогда Вы должны попробовать этот запрос.

SELECT
    COL1, MIN(COL2) AS COL2, MIN(COL3) AS COL3, COL4 AS COL4,
    MAX(CASE 
            WHEN ISNULL(COL5D,0) > 0 THEN 'COL5D'
            WHEN ISNULL(COL6D,0) > 0 THEN 'COL6D'
            WHEN ISNULL(COL7D,0) > 0 THEN 'COL7D'
            WHEN ISNULL(COL8D,0) > 0 THEN 'COL8D' END
       ) As ColRes
FROM TABLE1
WHERE ISNULL(COL5D,0) > 0 OR ISNULL(COL6D,0) > 0 OR ISNULL(COL7D,0) > 0 OR ISNULL(COL8D,0) > 0
GROUP BY COL1,COL4

Тогда вывод будет: (Использование GROUP-BY)

enter image description here

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

0 голосов
/ 07 ноября 2018

Что-то вроде:

select col1, col2, col3, col4
  , case when col5D > 0 then 'col5d' when col6D > 0 then 'col6d' when col7D > 0 then 'col7d' when col8D > 0 then 'col8d' else '' end
from table1
where col5d > 0 or col6D > 0 or col7D > 0 or col8D > 0
...