首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL (HSQLDB)查询以在LibreOffice基中创建等效的枢轴表

SQL (HSQLDB)查询以在LibreOffice基中创建等效的枢轴表
EN

Stack Overflow用户
提问于 2015-05-09 19:29:39
回答 1查看 1.4K关注 0票数 2

我正在LibreOffice库中处理一个数据库,并试图输出相当于一个枢轴表的数据。Base使用的是HSQL,据我所知,它不支持支点,但是您可以用它编写的报告非常适合我,所以我想继续使用它。

我想在我的支点中包含三个列:RotationModalityNumber

下面是数据目前的一个例子:

代码语言:javascript
复制
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

正如你所看到的,有三种模式。您可以有任意数量的模式-零或更多的每轮。

我想要的是(每次旋转的每个模态之和):

代码语言:javascript
复制
Rotation    |   Modality 1  |   Modality 2  |   Modality 3
1           |   5           |   3           |   4
2           |   11          |   0           |   2
3           |   1           |   4           |   0

(与ModalityRotation的情况相反,我也会同样高兴。)我已经搜索了很多,并想出了两种方法,我认为我应该能够做到这一点:使用CASE WHEN和使用子查询。

CASE WHEN 尝试

以下是我尝试过的:

代码语言:javascript
复制
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"   

该查询返回一个表,该表看起来与上面的表类似,除了显示每个模式的和外,它在一个(似乎)随机列中显示了该旋转中所有模式的和,如下所示:

代码语言:javascript
复制
Rotation    |   Modality 1  |   Modality 2  |   Modality 3
1           |               |               |   12
2           |               |               |   13
3           |   5           |               |   

所以查询的SUM()组件有问题,我只是不知道是什么。

尝试子查询

代码语言:javascript
复制
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"

产生:

代码语言:javascript
复制
Modality    |   Rotation 1  |   Rotation 2  |   Rotation 3
1           |   5           |   11          |   1

显然,由于“WHERE”子句,它只返回模态1,但我不知道如何让所有模式显示这个子查询方式。子查询代码的运行速度也比CASE WHEN慢得多,这让我怀疑这样做是否是错误的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-09 19:33:09

查询已关闭,只需将case语句放入sum statement中以执行conditional aggregation

代码语言:javascript
复制
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  
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30144157

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档