需要一个简单的T-SQL查询吗

需要一个简单的T-SQL查询吗,sql,sql-server,sql-server-2008,sql-server-2012,Sql,Sql Server,Sql Server 2008,Sql Server 2012,我有下表: PrimaryKeyColumn1 |PrimaryKeyColumn2 | Column_A | Column_B | Column_C| ID1 Key1 0 1 0 ID2 Key2 1 0 1 ID3 Key

我有下表:

PrimaryKeyColumn1 |PrimaryKeyColumn2 |   Column_A | Column_B | Column_C|
ID1                     Key1                 0           1         0
ID2                     Key2                 1           0         1      
ID3                     Key3                 1           1         0      
基本上,我需要找出一个T-SQL查询来获得如下结果:

ID1 Key1 B
ID2 Key2 A,C
ID3 Key3 A,B
有人能帮我弄清楚吗?列名包括列名末尾下划线后的字母A、b、c…z。0或1表示该字母是否适用于ID。如果0表示否,如果1表示是。因此,如果id为1,则它需要位于结果中id的旁边,否则如果id为0,则不需要


谢谢大家!

试试这种未经测试的方法

;with cte as
(
select *
from yourtable
cross apply (values ('A',ColumnA),
                    ('B',ColumnB),
                    ('C',ColumnC)) CS (name,value)
Where cs.value <> 0 
)
SELECT a.PrimaryKeyColumn,
       LEFT(cs.result, Len(cs.result) - 1) AS result                           
FROM   cte a
       CROSS APPLY (SELECT value + ','
                    FROM   cte B
                    WHERE  a.PrimaryKeyColumn = b.PrimaryKeyColumn
                    FOR XML PATH('')) cs (result)
GROUP  BY a.PrimaryKeyColumn,
          LEFT(cs.result, Len(cs.result) - 1) 

我认为最简单的方法就是使用用例和一些字符串逻辑:

select PrimaryKeyColumn1, PrimaryKeyColumn2,
       stuff(((case when column_a = 1 then ',A' else '' end) +
              (case when column_b = 1 then ',B' else '' end) +
              (case when column_c = 1 then ',C' else '' end)
             ), 1, 1, '') as vals
from . . .

我做过类似的事情

    CREATE TABLE #test
    (
        primaryKey nvarchar(150)
        , columnA bit
        , columnB bit
        , columnC bit
    ) -- create some test table

    INSERT INTO #test
    VALUES 
    ('ID1',1,0,0)
    ,('ID2',1,1,0)
    ,('ID3',1,0,1) -- as well as the test values

    SELECT
        *
    into #tmpUnpiv
    FROM #test
    UNPIVOT
    (
        truefalse
        for columnName in (columnA, columnB, columnC)
    ) unpiv; -- save the un-pivoted result as new table #tmpUnpiv

    SELECT
        DISTINCT
            primaryKey + ' ' + (SELECT replace(columnName,'column','') + ',' AS [text()]  from #tmpUnPiv WHERE primaryKey = p.primaryKey AND truefalse = 1 FOR XML PATH(''))
    FROM #tmpUnPiv p -- then combine results through XML PATH

    DROP TABLE #tmpUnPiv
    DROP TABLE #test
    -- drop temp tables

对不起,我忘了,有复合钥匙。所以我的表中有PrimaryKeyColumn1和PrimaryKeyColumn2。@user3314399-那么您需要将其添加到交叉应用中,其中的子句是什么?交叉应用是什么?我修改了桌子。你能看一下吗戈登的答案是一个简单得多的方法,特别是当你不知道交叉申请的情况下。这是值得学习的,但对于这样一个简单的结果来说可能有些过分。谢谢,它在关键字“values”附近显示了不正确的语法。只需将值更改为您喜欢的列别名即可。值是一个关键字/保留字。也可以用引号或大括号括起来。