Как использовать объединение, чтобы сделать простой отчет - PullRequest
0 голосов
/ 10 июня 2018

У меня есть простая таблица с именем «PizzaData», которая содержит следующие столбцы:

  1. cust_id INTEGER NOT NULL
  2. bill_date INTEGER NOT NULL
  3. pizza_amt INTEGER NOT NULL

bill_date (для простоты упражнения) - количество дней, прошедших с момента совершения транзакции.

Я хотел бы сделать следующий отчет:

+----------+-----------------+
| interval | total_pizza_amt |
+----------+-----------------+
| 0-29     | X               |
| 30-59    | Y               |
| 60+      | Z               |
+----------+-----------------+

По сути, я знаком с ключевым словом WITH, но только что понял, что это не так.не поддерживается в MySQL.Поэтому мне нужно как-то сгенерировать временный столбец и соединить его с таблицей PizzaData.

Как это можно сделать с MySQL?

Ответы [ 2 ]

0 голосов
/ 10 июня 2018

Я бы написал это как:

select (case when bill_date < 30 then '0-29'
             when bill_date < 60 then '30-59'
             else '60+'
        end) as bill_range,
       sum(pizza_amt) as total_pizza_amt
from PizzaData
group by bill_range
order by min(bill_date);

Примечания:

  • A case выражение гарантированно оценивает условия по порядку, поэтому вам не нужно between.
  • MySQL позволяет использовать псевдоним столбца в предложении group by (это делают не все базы данных).
  • interval - это ключевое слово MySQL и зарезервированное слово.Есть более подходящие имена для столбца.
  • order by гарантирует, что результаты будут в "логическом" порядке.
0 голосов
/ 10 июня 2018

Я думаю, это довольно просто с case:

select case when bill_date <= 29 then '0-29'
            when bill_date between 30 and 59 then '30-59'
            else '60+' end `interval`,
       sum(pizza_amt) `total_pizza_amt`
from PizzaData
group by case when bill_date <= 29 then '0-29'
              when bill_date between 30 and 59 then '30-59'
              else '60+' end;

или чище, используя подзапрос:

select `interval`, sum(pizza_amt) `total_pizza_amt` from (
    select case when bill_date <= 29 then '0-29'
                when bill_date between 30 and 59 then '30-59'
                else '60+' end `interval`,
           pizza_amt
    from PizzaData
) `a` group by `interval`;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...