SQL (HSQLDB) 查询以在 LibreOffice Base 中创建一个等同于 table 的数据透视表

SQL (HSQLDB) query to create a pivot table equivalent in LibreOffice Base

我正在 LibreOffice Base 中处理一个数据库,并尝试输出相当于一个枢轴 table。 Base 使用 HSQL,据我所知,它不支持 pivot,但是你可以用它制作的报告对我来说是完美的,所以我想坚持使用它。

我想在我的数据透视表中包含三个列: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 感到满意。)我已经搜索了很多并提出了两种我认为应该能够的方法要实现这一点:使用 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"   

这个查询 returns 一个 table 看起来像上面的查询,除了不是显示每个模态的总和,它显示一个(看似)随机的旋转中所有模态的总和专栏,像这样:

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' 子句,它只有 returns 模态 1,但我无法弄清楚如何让所有模态显示这种子查询方式。子查询代码的运行速度也比 CASE WHEN 慢得多,这让我想知道这样做是否是错误的方法。

您的查询已结束,您只需将 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