在 LibreOffice Base 中创建等效数据透视表的 SQL (HSQLDB) 查询
Posted
技术标签:
【中文标题】在 LibreOffice Base 中创建等效数据透视表的 SQL (HSQLDB) 查询【英文标题】:SQL (HSQLDB) query to create a pivot table equivalent in LibreOffice Base 【发布时间】: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
慢,这让我怀疑这是不是错误的处理方式。
【问题讨论】:
【参考方案1】:您的查询已接近,您只需将 case
语句放在 sum 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
【讨论】:
绝对完美。谢谢! @MartinHennessy 请注意,HSQLDB 2.x 还支持更易读的(至少对我而言)标准FILTER
表达式:SUM(number) filter (where Modality = 1)
以上是关于在 LibreOffice Base 中创建等效数据透视表的 SQL (HSQLDB) 查询的主要内容,如果未能解决你的问题,请参考以下文章
在 ggplot2 中创建散点图矩阵(pairs() 等效)
Java 应用程序可以在 LibreOffice 中创建报告吗?
为啥当从 word doc 或 docx 导入 odt 文件时,LibreOffice 在方程中创建反问号
如何在 LibreOffice Writer 中输入大表格?