根据值对列进行分组,然后连接到单个值?

时间:2011-12-09 21:34:34

标签: sql sql-server sql-server-2005

我在这里看到很多论坛对我的情况不起作用。我有

Col_1,   Col_2,    Col_3,   Col_n
TRUE     FALSE     FALSE    FALSE
FALSE    TRUE      TRUE     FALSE
TRUE     FALSE     FALSE    TRUE

我需要创建一个select语句,返回一个包含以下结果的新列:

New_Column
Col_1
Col_2, Col_3
Col_1, Col_n

换句话说,如果列为True,则将列名称添加到我的新列。所以我的结果集看起来像:

myID, myName, myDesc, Col_1, Col_2, Col_3, Col_n, New_Column

我试过了:

SELECT
  myID,
  myName,
  myDesc,
  ((CASE WHEN col_1 = 'TRUE' THEN 'col_1' END) + ', ' + (CASE WHEN col_2 = 'TRUE' THEN 'col_2' END) + ', ' + (CASE WHEN col_3 = 'TRUE' THEN 'col_3' END) + ', ' + (CASE WHEN col_n = 'TRUE' THEN 'col_n' END) ) as  New_Column
FROM myTable

但结果集不正确。如何通过给我的设计获得我需要的结果集?

当我说结果不正确时,我的意思是:

myID, myName, myDesc, Col_1, Col_2, Col_3, Col_n, New_Column
Data, Data, TRUE, False, false, true, Null
Data, Data, false, Col_2, Col_3, false, Null
Data, Data, Col_1, Null, Null, Col_n, Col_1Col_2Col_3Col_n

这就是我的期望:

myID, myName, myDesc, Col_1, Col_2, Col_3, Col_n, New_Column
Data, data, Col_1, Col_2, NULL, Col_N, Col_1Col_2Col_N

1 个答案:

答案 0 :(得分:0)

我的猜测是你得到一个NULL结果,因为当列为FALSE时,每个CASE子句都会返回NULL。你应该做的事情如下:

BEGIN TRAN
CREATE TABLE MyTable (col_1 VARCHAR(5),
                        col_2 VARCHAR(5),
                        col_3 VARCHAR (5),
                        col_n VARCHAR(5)
                        )
INSERT INTO MyTable
SELECT 'TRUE', 'FALSE', 'TRUE', 'TRUE'                       
UNION ALL
SELECT 'FALSE', 'FALSE', 'FALSE', 'FALSE'                        


SELECT  STUFF(( CASE WHEN col_1 = 'TRUE' THEN ',col_1'
                     ELSE ''
                END ) + ( CASE WHEN col_2 = 'TRUE' THEN ',col_2'
                               ELSE ''
                          END ) + ( CASE WHEN col_3 = 'TRUE' THEN ',col_3'
                                         ELSE ''
                                    END )
              + ( CASE WHEN col_n = 'TRUE' THEN ',col_n'
                       ELSE ''
                  END ), 1, 1, '') AS New_Column
FROM    myTable 

ROLLBACK