2013-04-02 67 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 

編輯:

產生的結果集看起來像這樣

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()如果值是真查詢僅限於YN

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

更新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'的數據類型是'BIT'。那麼,op更新了他的問題,並顯示這些列實際上並不是「BIT」,因此,現在取消了downvote並立即投入了它 – Lamak

+0

@Lamak我知道。但是所示的值是'Y'和'N'。 OP需要澄清數據類型,如果它是BIT,那麼我刪除這個答案。 –

+0

他/他最初說'N'和'Y'values是布爾值:* N和Y是bool值*。但在此之後,他/他顯示他/他實際上正在計算這些值爲'CASE'表達式中的'1'和'0',所以您的答案完全正確 – 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

你的問題的編輯後,你可以簡單地直接使用,而不是使用MAX表達PIVOT表運算符,是這樣的:

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