代码之家  ›  专栏  ›  技术社区  ›  Elimination

如何利用join制作简单报表

  •  0
  • Elimination  · 技术社区  · 7 年前

    我有一个名为“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 回复  |  直到 7 年前
        1
  •  3
  •   Gordon Linoff    7 年前

    我会这样写:

    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 保证结果按“逻辑”顺序排列。
        2
  •  2
  •   Michał Turczyn    7 年前

    我觉得很容易 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;
    

    或cleaner,使用子查询:

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