【发布时间】:2015-05-09 19:29:39
【问题描述】:
我正在开发 LibreOffice Base 中的数据库,并尝试输出相当于数据透视表的内容。 Base 使用 HSQL,据我所知,它不支持数据透视,但您可以使用它制作的报告对我来说非常完美,所以我想坚持使用它。
我想在我的数据透视中涉及三个列: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 也同样满意。)我搜索了很多,并想出了两种我认为应该能够实现这一目标的方法:使用@ 987654328@ 并使用子查询。
正在尝试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
现在很明显,由于“WHERE”子句,它只返回模态 1,但我不知道如何让所有模态以这种子查询方式显示。子查询代码的运行速度也比CASE WHEN 慢,这让我怀疑这是不是错误的处理方式。
【问题讨论】: