2015-08-11 3 views
3

Я следующая таблица:Нужна простая T-SQL Query

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 указывает, относится ли это письмо к идентификатору или нет. Если 0 означает, что нет, и если 1 означает «да». поэтому он должен быть рядом с идентификатором в результатах, если он равен 1 в противном случае, если он равен 0.

Спасибо!

ответ

2

Я думаю, что самый простой способ это просто использовать CASE и некоторые строки логики:

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 . . . 
+0

спасибо, это говорит о некорректном синтаксисе рядом с ключевым словом «values». – user3314399

+2

Просто измените 'values' на псевдоним столбца, который вы предпочитаете. 'values' - ключевое слово/зарезервированное слово. Вы также можете поместить его в кавычки или квадратные скобки. – shawnt00

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) 
+0

Извините, я забыл, что есть составные ключи в основном. Поэтому у меня есть PrimaryKeyColumn1 и PrimaryKeyColumn2 в моей таблице. – user3314399

+0

@ user3314399 - Затем вам нужно добавить его в 'cross apply', где статья –

+0

извините, что такое крест? Я изменил таблицу. Можете ли вы посмотреть? – user3314399

1

я сделал что-то вроде этого

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 
Смежные вопросы