在 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,据我所知,它不支持数据透视,但您可以使用它制作的报告对我来说非常完美,所以我想坚持使用它。

我想在我的数据透视中涉及三个列:RotationModalityNumber

以下是当前数据的示例:

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 也同样满意。)我搜索了很多,并想出了两种我认为应该能够实现这一目标的方法:使用@ 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 导入 o​​dt 文件时,LibreOffice 在方程中创建反问号

如何在 LibreOffice Writer 中输入大表格?

如何在python中创建等效结构并使用malloc更改空指针的引用

如何在 python 抽象类中创建抽象属性