列名的动态选择

问题描述 投票:1回答:2

我要选择列名称,它具有非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

有可能吗?

sql sql-server grouping dynamic-sql
2个回答
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

1
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.