База 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. Чтобы этот запрос работал, вам нужно включить EditRun 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" на фактическое имя вашей таблицы.

Другие вопросы по тегам