2014-03-04 17 views
0

我有一個字段的表: Client_ID, Date, Value 那裏是每個12個月,今年的條目(即,12項爲每個客戶端)。SQLite的選擇:在一個線分組中,12項

我想創建一個表,每個Client_ID只包含一行,其中包含每個月的所有值。喜歡的東西:

Client_ID, Date_January, Value_January, Date_February, Value_February, ........, Date_December, Value_December

誰能幫我查詢?

這就是我想要做的(沒有工作...):

select 
    Client_Id, 
    case when ((strftime('%m', Date) = '01')) then 
     Date as Date_January, 
     Value as Value_January, 
    else null end 
    case when ((strftime('%m', Date) = '01')) then 
     Date as Date_February, 
     Value as Value_February, 
    else null end 
.... 

from Test_Table 
where 
    strftime('%Y', Date) = '2013' 

;

回答

1

首先,您需要解開您的案例結構,因爲它們會生成單個值。用途:

case 
    when ((strftime('%m', Date) = '01')) then Date 
    else null 
end as Date_January, 
case when ((strftime('%m', Date) = '01')) then Value 
    else null 
end as Value_January, 

然後,如果你想每個客戶一行,使用GROUP BY客戶端ID。

第三個問題是如何將所有Date_January列聚合成一行。如果您確實知道每個客戶端每月只有一行,則可以使用MAX()知道非空值將高於NULL值:

select 
    Client_Id, 
MAX(case 
    when ((strftime('%m', Date) = '01')) then Date 
    else null 
end) as Date_January, 
MAX(case when ((strftime('%m', Date) = '01')) then Value 
    else null 
end) as Value_January, 
MAX(case 
    when ((strftime('%m', Date) = '02')) then Date 
    else null 
end) as Date_February, 
MAX(case when ((strftime('%m', Date) = '02')) then Value 
    else null 
end) as Value_February, 
.... 

from Test_Table 
where 
    strftime('%Y', Date) = '2013' 
group by Client_Id; 
+0

非常感謝,它正在使用案例像你說的。是否有可能以'清潔'方式完成同樣的事情(例如使用聯合或聯接?) – Tero

+0

我想如果你創建12個具有不同列名的表並將它們聯合起來,那麼它可能會更清潔一點。 - 你真正需要的是PIVOT http://technet.microsoft.com/en-us/library/ms177410(v=sql.105).aspx但對於sqlite我不知道這個簡單的實現。 –

相關問題