我正在使用LibreOffice Base中的數據庫,並嘗試輸出數據透視表的等效項。 Base使用HSQL,據我瞭解,它不支持數據透視表,但您可以使用HSQL的報表對我來說是完美的,所以我想堅持下去。SQL(HSQLDB)查詢在LibreOffice基礎中創建相應的數據透視表
有三個欄目我想介入我的主題:Rotation
,Modality
和Number
。
這裏的數據如何看待當前的例子:
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
(我會用Modality
和Rotation
周圍的其他方法同樣幸福)我已搜索周圍很多,並想出了兩種方法,我認爲我應該能夠實現這一點:使用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
慢,這讓我想知道這是否是錯誤的方法。
絕對完美。謝謝! –
@MartinHennessy請注意,HSQLDB 2.x還支持稍微更易讀(至少對我來說)標準的'FILTER'表達式:'SUM(數字)過濾器(其中Modality = 1)' –