在MSSQL中动态选择列名

时间:2018-11-07 01:36:12

标签: sql sql-server grouping dynamic-sql

我要选择具有非null和非零值的列名。因此,任何具有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 :(得分:1)

您对GROUP-BY和输出结果的疑问令人困惑。 B'cz GROUP-BY将合并结果行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

注意 :请更正您的预期结果/问题,并将正确的结果作为“答案”进行检查,否则其他用户会感到困惑。

答案 1 :(得分:0)

类似的东西:

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