LibreOffice Base - SQL 查询困难
LibreOffice Base - Difficulties with SQL query
我有一个包含 3 列的 table,例如 Food
、Type
和 Taste
。
- 列
Food
可以有任何内容
- 列
Type
可能有 'Fruit' 或 'Vegetable' 作为可能的值
- 列
Taste
可能有 'Bad'、'Good' 或 'Delicious' 作为可能的值
我试图得到(到目前为止运气不好)一个 SQL 语句,它会产生一个 table 像:
Bad Good Delicious Total
Fruit 05 09 16 20
Vegetables 12 20 03 35
Total 17 29 19 55
如果输出 table 上的数字是每个 Type
/ Taste
组合的 table 中有多少 Food
的计数。
如何实现?
前两行可以在一个带有子查询子句的查询中完成:
SELECT X."Type",
SUM(X."Bad") AS "Bad",
SUM(X."Good") AS "Good",
SUM(X."Delicious") AS "Delicious",
SUM(X."Total") AS "Total"
FROM (SELECT "Type",
CASEWHEN("Taste" = 'Bad',1,0) AS "Bad",
CASEWHEN("Taste" = 'Good',1,0) AS "Good",
CASEWHEN("Taste" = 'Delicious',1,0) AS "Delicious",
1 AS "Total" FROM "YourTableName") X
GROUP BY "Type"
子查询创建列 "Bad"、"Good" 和 "Delicious",每列中有 1 或 0,然后查询的外部将所有值相加。
要获得底部的总计行,您必须使用 UNION ALL
,这是基本解析器不支持的。要使此查询正常工作,您需要打开 Edit
→Run SQL Directly
选项。 (这将禁用某些需要解析器的表单和报告功能 - 这可能对您的使用无关紧要,但仅供参考,如果您稍后在表单或报告中使用此查询。)
您将 UNION ALL
使用的查询基本上是相同的查询,只是不按类型分组。所以总计:
SELECT X."Type",
SUM(X."Bad") AS "Bad",
SUM(X."Good") AS "Good",
SUM(X."Delicious") AS "Delicious",
SUM(X."Total") AS "Total"
FROM (SELECT "Type",
CASEWHEN("Taste" = 'Bad',1,0) AS "Bad",
CASEWHEN("Taste" = 'Good',1,0) AS "Good",
CASEWHEN("Taste" = 'Delicious',1,0) AS "Delicious",
1 AS "Total" FROM "YourTableName") X
GROUP BY "Type"
UNION ALL
SELECT 'Total' AS "BottomTotal",
SUM(Y."Bad"),
SUM(Y."Good"),
SUM(Y."Delicious"),
SUM(Y."Total")
FROM (SELECT CASEWHEN("Taste" = 'Bad',1,0) AS "Bad",
CASEWHEN("Taste" = 'Good',1,0) AS "Good",
CASEWHEN("Taste" = 'Delicious',1,0) AS "Delicious",
1 AS "Total" FROM "YourTableName") Y
GROUP BY "BottomTotal"
确保始终将 "YourTableName" 替换为您的实际 table 姓名。
我有一个包含 3 列的 table,例如 Food
、Type
和 Taste
。
- 列
Food
可以有任何内容 - 列
Type
可能有 'Fruit' 或 'Vegetable' 作为可能的值 - 列
Taste
可能有 'Bad'、'Good' 或 'Delicious' 作为可能的值
我试图得到(到目前为止运气不好)一个 SQL 语句,它会产生一个 table 像:
Bad Good Delicious Total
Fruit 05 09 16 20
Vegetables 12 20 03 35
Total 17 29 19 55
如果输出 table 上的数字是每个 Type
/ Taste
组合的 table 中有多少 Food
的计数。
如何实现?
前两行可以在一个带有子查询子句的查询中完成:
SELECT X."Type",
SUM(X."Bad") AS "Bad",
SUM(X."Good") AS "Good",
SUM(X."Delicious") AS "Delicious",
SUM(X."Total") AS "Total"
FROM (SELECT "Type",
CASEWHEN("Taste" = 'Bad',1,0) AS "Bad",
CASEWHEN("Taste" = 'Good',1,0) AS "Good",
CASEWHEN("Taste" = 'Delicious',1,0) AS "Delicious",
1 AS "Total" FROM "YourTableName") X
GROUP BY "Type"
子查询创建列 "Bad"、"Good" 和 "Delicious",每列中有 1 或 0,然后查询的外部将所有值相加。
要获得底部的总计行,您必须使用 UNION ALL
,这是基本解析器不支持的。要使此查询正常工作,您需要打开 Edit
→Run SQL Directly
选项。 (这将禁用某些需要解析器的表单和报告功能 - 这可能对您的使用无关紧要,但仅供参考,如果您稍后在表单或报告中使用此查询。)
您将 UNION ALL
使用的查询基本上是相同的查询,只是不按类型分组。所以总计:
SELECT X."Type",
SUM(X."Bad") AS "Bad",
SUM(X."Good") AS "Good",
SUM(X."Delicious") AS "Delicious",
SUM(X."Total") AS "Total"
FROM (SELECT "Type",
CASEWHEN("Taste" = 'Bad',1,0) AS "Bad",
CASEWHEN("Taste" = 'Good',1,0) AS "Good",
CASEWHEN("Taste" = 'Delicious',1,0) AS "Delicious",
1 AS "Total" FROM "YourTableName") X
GROUP BY "Type"
UNION ALL
SELECT 'Total' AS "BottomTotal",
SUM(Y."Bad"),
SUM(Y."Good"),
SUM(Y."Delicious"),
SUM(Y."Total")
FROM (SELECT CASEWHEN("Taste" = 'Bad',1,0) AS "Bad",
CASEWHEN("Taste" = 'Good',1,0) AS "Good",
CASEWHEN("Taste" = 'Delicious',1,0) AS "Delicious",
1 AS "Total" FROM "YourTableName") Y
GROUP BY "BottomTotal"
确保始终将 "YourTableName" 替换为您的实际 table 姓名。