动态选择列名

Dynamically selection of Column Name

我想要 select 列名称 具有非空值和非零值。因此,任何具有 0 或 NULL 的 列名称 不应显示在输出网格中

我有如下来源table

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

可能吗?

类似于:

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

您关于 GROUP-BY 和输出结果的问题令人困惑。 B'cz GROUP-BY 将合并 Result Row-1&2.

但为了获得更好的结果,您可以尝试以下查询以确保安全。

创建Table定义

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

结果 ②→使用问题中所示 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

注意:请更正您的预期result/question并检查正确的结果作为答案,否则其他用户会糊涂的。