2016-01-14 23 views
1

對不起,如果這代表高爾夫像代碼,但我試圖避免從數據庫中獲取數據,在應用程序代碼中處理需要對數據集進行sloow循環的地方,這些數據集中有索引可以幫助分組。在SQLite中組合兩列的聰明方式?

有什麼辦法都從一個數據集這樣得到:

sqlite> create table tst (id INTEGER, label TEXT, variable TEXT, value FLOAT); 
sqlite> insert into tst values (1,"label1","variable 1",1.2); 
sqlite> insert into tst values (1,"label2","variable 2",2.2); 
sqlite> insert into tst values (1,"label3","variable 3",3.2); 
sqlite> select * from tst; 
id   label  variable value  
---------- ---------- ---------- ---------- 
1   label1  variable 1 1.2  
1   label2  variable 2 2.2  
1   label3  variable 3 3.2 

像這樣被退回(與輸出列的名字被從variablelabel列的內容構建內容):

sqlite> <magic query here> 
id   label1_variable1 label2_variable2 label3_variable3  
---------- ----------   ----------   ---------- 
1   1.2    2.2     3.2  

即是寬格式而不是長格式?

請指教,或只是通過證明無法完成的幫助。

回答

1

你可以做到這一點通過樞軸查詢:

SELECT id, 
    SUM(CASE WHEN label = 'label1' THEN value ELSE 0 END) AS 'label1_variable1', 
    SUM(CASE WHEN label = 'label2' THEN value ELSE 0 END) AS 'label2_variable2', 
    SUM(CASE WHEN label = 'label3' THEN value ELSE 0 END) AS 'label3_variable3' 
FROM tst 
GROUP BY id 

你不能用一個未知的一組列執行SQLite中樞軸查詢,因爲這樣做會需要動態SQL。作爲用戶@CL。在下面的評論中提到,模擬動態SQL的一種方法是首先執行SELECT DISTINCT label FROM tst以獲得所有列的集合,然後是類似我上面給出的數據透視查詢。您將不得不從應用程序層以編程方式構建數據透視表。

+0

是的,對不起,我不清楚我的問題。在查詢制定時,我需要創建列的名稱是未知的。因此,如果'label'中有一個「label4」,並且'variable'中有一個「variable4」,那麼我也會在輸出中得到一個'label4_variable4'列。 –

+0

你將需要動態SQL來實現這一點,我不知道SQLite是否支持動態SQL。 –

+0

它不; SQLite是一個嵌入式數據庫,旨在與「真正的」編程語言一起使用。 –

相關問題