2015-08-14 34 views
0

我的表格中有如下數據。標誌位和標籤是varchar。如何在sql中的兩列上使用Pivot

parentid code label flag 
1  abc hello false 
1  xyz bye  false 
1  qrt hi  true 

我需要爲

parentid label_abc flag_abc label_xyz flag_xyz label_qrt flag_qrt 

我只能取唯一的標籤,現在使用透視獲取的記錄,但是當我給第二聚集的功能標誌提示錯誤(附近有語法錯誤, 」)。有什麼方法可以使用Pivot來獲取兩列。

我做了這樣的事情:

SELECT distinct 
     parentid  
     , [abc] as label_abc 
     , [xyz] as label_xyz 
     , [qrt] as label_qrt 
FROM (
Select 
    parentid, 
    label,code 
FROM items 
    ) a 
Pivot ( 
Max(label), max (flag) 
FOR code in ([abc], [xyz], [qrt] 
    ) as Pvt 

回答

1

我覺得這是一個有點棘手使用pivot運營商這樣做,有很多更容易使用,而不是有條件聚集:

select 
    parentid, 
    max(case when code = 'abc' then label end) as label_abc, 
    max(case when code = 'abc' then flag end) as flag_abc, 
    max(case when code = 'xyz' then label end) as label_xyz, 
    max(case when code = 'xyz' then flag end) as flag_xyz, 
    max(case when code = 'qrt' then label end) as label_qrt, 
    max(case when code = 'qrt' then flag end) as flag_qrt 
from ( 
    select parentid, code, label, cast(flag as int) flag 
    from items 
) src 
group by parentid; 

Sample SQL Fiddle

0

是的,但它們需要單獨旋轉。它需要一點花式的步法,但它應該看起來更像:

select distinct parentid 
, [abc1] as label_abc 
, [xyz1] as label_xyz 
, [qrt1] as label_qrt 
, [abc2] as flag_abc 
, [xyz2] as flag_xyz 
, [qrt2] as flag_qrt 
from (
    select parentid 
    , label 
    , label + '1' as code1 
    , label + '2' as code2 
    from items 
) as a 
pivot (
    max(label) for code1 in ([abc1], [xyz1], [qrt1]) 
) as pvt1 
pivot (
    max(flag) for code2 in ([abc2], [xyz2], [qrt2]) 
) as pvt2 
+0

嗨,Will對不起,我認爲你沒有看到我的編輯。國旗是一點。 – Agga

+0

這幾乎是正確的,但有一些錯誤。正確的版本應該是這樣的:http://www.sqlfiddle.com/#!3/47cba/1 – jpw

+0

啊,我的壞。無論如何,它仍然會工作,如果做了明確的轉換(如'max(convert(int,flag))'),儘管你需要將它轉換回外部選擇。或者我想你可能能夠做一些位數學代替max(旗),但我從來沒有嘗試過.. –