База LibreOffice - Сложности с запросом SQL
У меня есть таблица с 3 столбцами, например, Food
, Type
, а также Taste
,
- колонка
Food
может быть что угодно - колонка
Type
может иметь "Фрукты" или "Овощи" в качестве возможных значений - колонка
Taste
может иметь значения "Плохой", "Хороший" или "Вкусный" в качестве возможных значений
Я пытаюсь получить (пока что не повезло) оператор SQL, который выдает такую таблицу:
Bad Good Delicious Total
Fruit 05 09 16 20
Vegetables 12 20 03 35
Total 17 29 19 55
Были ли числа в выходной таблице COUNT того, сколько Food
в таблице для каждого Type
/ Taste
сочетание.
Как это может быть достигнуто?
1 ответ
Первые две строки могут быть выполнены в одном запросе с предложением подзапроса:
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"
Подзапрос создает столбцы "Плохой", "Хороший" и "Вкусный" с 1 или 0 в каждом столбце, затем внешняя часть запроса складывает все значения.
Чтобы получить итоговую строку внизу, вы должны использовать UNION ALL
который не поддерживается парсером Base. Чтобы этот запрос работал, вам нужно включить 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" на фактическое имя вашей таблицы.