【问题标题】:Group columns based on value and then concatenate to a single value?根据值对列进行分组,然后连接到单个值?
【发布时间】:2011-12-09 21:34:33
【问题描述】:

我在这里看到很多不适合我的情况的论坛。我有

Col_1、Col_2、Col_3、Col_n 对 错 错 错 假 真 真 假 对 错 错 对

我需要创建一个 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
数据,数据,真,假,假,真,空
数据,数据,假,Col_2,Col_3,假,空
数据、数据、Col_1、Null、Null、Col_n、Col_1Col_2Col_3Col_n

这是我所期望的:

myID、myName、myDesc、Col_1、Col_2、Col_3、Col_n、New_Column
数据,数据,Col_1,Col_2,NULL,Col_N,Col_1Col_2Col_N

【问题讨论】:

  • ……嗯,对于初学者来说,她会得到比她可能想要的更多的逗号,因为那些不是有条件的……在 MySQL 中,group_concat 可以工作,但我没有认为这适用于 MS-SQL Server。
  • 对某些记录返回值、值、真、真、假、空。对于其他记录,它显示 value、value、Col_1、Null、Col_3、Null、Null,在这种情况下,New_Column 应该是 value、value、Col_1、Null、Col_3、Null、Col_1 和 Col_3。有时它返回 value, value, col_1, col_2, null, null, (col_1,col_2,col_3,col_n)
  • 如果您要投反对票...请同时投票结束或解释原因。这可能是一项因可怕的要求而产生的任务,但这是一项非常特殊(而且不是很容易)的任务,已经以明确的方式提出(在尝试了某事之后)。
  • 非常感谢 pst - 我真的很清楚,我做了研究,但如有必要,我可以提供更多细节。这个东西的问题是它不允许你进行太多的格式化,这很耗时。

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


【解决方案1】:

我的猜测是,您得到的结果是 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

【讨论】:

    猜你喜欢
    • 2018-01-10
    • 2019-11-20
    • 1970-01-01
    • 2020-11-10
    • 2019-02-12
    • 1970-01-01
    • 2014-09-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多