2013-04-02 2 views
1

Как включить эти несколько строк в одну строку? N и Y - значения bool.T-Sql: перевернуть несколько строк в одну строку

Id IsPnt IsPms, IsPdt 
1 N  Y  N 
1 N  Y  N 
1 Y  N  N 

в этом

Id IsPnt IsPms, IsPdt 
1 Y  Y  N 

Edit:

Запрос, который производит ResultSet выглядит следующим образом

select b.id, 
    CASE mpft.PlanIndCd WHEN 'PBMN' THEN 1 ELSE 0 END AS IsPnt, 
    CASE mpft.PlanIndCd WHEN 'PBMT' THEN 1 ELSE 0 END AS IsPbt, 
    CASE mpft.PlanIndCd WHEN 'PBMS' THEN 1 ELSE 0 END AS IsPms 
from vw_D_SomveViewName pb 
    -- bunch of joins 
where mpft.PlanIndCd in ('HANR', 'PBMN','PBMT','PBMS','HAWR') 

ответ

4

Вы можете просто использовать MAX() на этом, если значения на самом деле Y и N только.

SELECT ID, MAX(IsPnt) IsPnt, MAX(IsPms) IsPms, MAX(IsPdt) IsPdt 
FROM tableName 
GROUP BY ID 

UPDATE 1

SELECT b.id, 
     MAX(CASE mpft.PlanIndCd WHEN 'PBMN' THEN 1 ELSE 0 END) AS IsPnt, 
     MAX(CASE mpft.PlanIndCd WHEN 'PBMT' THEN 1 ELSE 0 END) AS IsPbt, 
     MAX(CASE mpft.PlanIndCd WHEN 'PBMS' THEN 1 ELSE 0 END) AS IsPms 
FROM vw_D_SomveViewName pb 
     -- bunch of joins 
WHERE mpft.PlanIndCd in ('HANR', 'PBMN','PBMT','PBMS','HAWR') 
GROUP BY b.ID 
+1

Вы не можете использовать '' MIN' или MAX', если тип данных столбцов 'IsPnt',' 'IdPms' и IsPdt' являются «БИТ». Ну, op обновил свой вопрос и показывает, что эти столбцы на самом деле не являются «BIT», поэтому удалил downvote и сохранил его сейчас. – Lamak

+0

@Lamak я знаю. но показаны значения «Y» и «N». OP нуждается в уточнении для типа данных, если это BIT, тогда я удалю этот ответ. –

+0

Первоначально он сказал, что значения 'N' и' Y' были логическими: * N и Y являются значениями bool *. Но после этого он/она показал, что он/она фактически вычисляет эти значения как '1' и' 0 'из выражения' CASE', так что ваш ответ в порядке – Lamak

-5
select Id, MAX(IPnt), MAX(IsPms), MAX(IsPdt) 
from table etc 
+0

@Mahmoud. Да. Это подразумевалось в бит «etc». Я предполагаю, что человек, которого я пишу, не является идиотом. –

+0

Речь идет не о том, чтобы быть «идиотом» или нет, а о предоставлении полного ответа. Кроме того, другие пользователи по дороге, которые менее разбираются в SQL, могут найти этот ответ и не понимать его. – LittleBobbyTables

+4

Код только ответы достаточно плохие, неполные (лень я принимаю) код только ответы хуже – Lamak

1

Будет ли это работать?

select 
    id, 
    max(IsPnt), 
    max(IsPms), 
    max(IsPdt) 
from 
    table 
GROUP BY 
    id 
0

После редактирования вашего вопроса, вы можете просто использовать оператор PIVOT таблицы непосредственно вместо того, чтобы использовать выражение MAX, что-то вроде:

SELECT 
    Id, 
    PBMN AS IsPnt, 
    PBMT AS IsPbt, 
    PBMS AS IsPms 
FROM 
(
    SELECT 
    id, 
    mpft.PlanIndCd, 
    ROW_NUMBER() OVER(PARTITION BY id 
         ORDER BY (SELECT 1)) AS RN 
    from vw_D_SomveViewName pb 
    -- bunch of joins 
    where mpft.PlanIndCd in ('HANR', 'PBMN','PBMT','PBMS','HAWR') 
) AS t 
PIVOt 
(
    MAX(RN) 
    FOR PlanIndCd IN ([PBMN], [PBMT], [PBMS]) 
) AS p; 

Вы можете увидеть его в действии в следующей демонстрации пример:

Demo on SQL Fiddle

Смежные вопросы