2015-05-09 31 views
1

我正在使用LibreOffice Base中的數據庫,並嘗試輸出數據透視表的等效項。 Base使用HSQL,據我瞭解,它不支持數據透視表,但您可以使用HSQL的報表對我來說是完美的,所以我想堅持下去。SQL(HSQLDB)查詢在LibreOffice基礎中創建相應的數據透視表

有三個欄目我想介入我的主題:Rotation,ModalityNumber

這裏的數據如何看待當前的例子:

Rotation | Modality | Number 
1   | 1   | 5 
1   | 2   | 3 
1   | 3   | 4 
2   | 1   | 6 
2   | 1   | 5 
2   | 3   | 2 
3   | 1   | 1 
3   | 2   | 4 

正如你所看到的,有三種方式。您可以擁有任意數量的模式 - 每轉一次或多次。

什麼後(每轉各形態的總和)我:

Rotation | Modality 1 | Modality 2 | Modality 3 
1   | 5   | 3   | 4 
2   | 11   | 0   | 2 
3   | 1   | 4   | 0 

(我會用ModalityRotation周圍的其他方法同樣幸福)我已搜索周圍很多,並想出了兩種方法,我認爲我應該能夠實現這一點:使用CASE WHEN並使用子查詢。

試圖CASE WHEN

這裏是我試過:

SELECT "Rotation" 
    ,CASE "Modality" WHEN 1 THEN SUM("Number") END 
    ,CASE "Modality" WHEN 2 THEN SUM("Number") END 
    ,CASE "Modality" WHEN 3 THEN SUM("Number") END 
FROM  "my database" 
GROUP BY "Rotation" 
ORDER BY "Rotation" 

該查詢返回一個表,看起來像一個以上的除外,而不是顯示每個模式的總和,它顯示在一個(看似)隨機列中的所有模態的總和,如下所示:

Rotation | Modality 1 | Modality 2 | Modality 3 
1   |    |    | 12 
2   |    |    | 13 
3   | 5   |    | 

所以查詢的SUM()組件有些問題,我只是無法弄清楚什麼。

試圖子查詢

SELECT "Modality" 
    ,(SELECT SUM("Number") FROM "my database" WHERE "Rotation" = 1 AND "Modality" = 1) 
    ,(SELECT SUM("Number") FROM "my database" WHERE "Rotation" = 2 AND "Modality" = 1) 
    ,(SELECT SUM("Number") FROM "my database" WHERE "Rotation" = 3 AND "Modality" = 1) 
FROM "my database" 
WHERE "Modality" = 1 
GROUP BY "Modality" 

產生:

Modality | Rotation 1 | Rotation 2 | Rotation 3 
1   | 5   | 11   | 1 

現在很明顯,它只返回方式1,由於 'WHERE' 條款,但我無法弄清楚如何獲得所有模態都以這種子查詢方式顯示。子查詢代碼的運行速度也比CASE WHEN慢,這讓我想知道這是否是錯誤的方法。

回答

0

您所查詢的接近,你只需要把case聲明總和statement內進行conditional aggregation

SELECT Rotation 
    , SUM(CASE WHEN Modality = 1 THEN Number END) 
    , SUM(CASE WHEN Modality = 2 THEN Number END) 
    , SUM(CASE WHEN Modality = 3 THEN Number END) 
FROM  yourtable 
GROUP BY Rotation 
ORDER BY Rotation 
+0

絕對完美。謝謝! –

+0

@MartinHennessy請注意,HSQLDB 2.x還支持稍微更易讀(至少對我來說)標準的'FILTER'表達式:'SUM(數字)過濾器(其中Modality = 1)' –