如何利用join生成一个简单的报表

xiozqbni  于 2021-06-21  发布在  Mysql
关注(0)|答案(2)|浏览(292)

我有一个名为“pizzadata”的简单表,其中包含以下列:
cust_id INTEGER NOT NULL bill_date INTEGER NOT NULL pizza_amt INTEGER NOT NULL bill_date (为简单起见)是交易完成后经过的天数。
我想做以下报告:

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

基本上我熟悉 WITH 但是我刚刚意识到mysql不支持它。所以我需要以某种方式生成一个临时列,并将其与 PizzaData table。
用mysql怎么做?

acruukt9

acruukt91#

我觉得这很容易 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`;
2ekbmq32

2ekbmq322#

我会这样写:

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);

笔记:
case 表达式保证按顺序计算条件,因此不需要 between .
mysql允许您在 group by 子句(并非所有数据库都这样做)。 interval 是mysql关键字和保留字。这列有更好的名字。
这个 order by 保证结果按“逻辑”顺序排列。

相关问题