【问题标题】:Select month, year and quantity and show months with zero entries [duplicate]选择月份、年份和数量,并显示零条目的月份[重复]
【发布时间】:2019-02-13 04:16:50
【问题描述】:

我有以下 mysql 查询:

SELECT 
LEFT(MONTHNAME(date), 3) AS month,
YEAR(date) AS year,
COUNT(id) AS quantity
FROM
budgets
GROUP BY MONTH(date)

返回给我这个:

|month|year|quantity|
---------------------
|  Jan|2018|      10|
|  Mar|2018|       2|
|  May|2018|       5|

即使COUNT(id) 不存在,我也需要显示月份 像这样:

|month|year|quantity|
---------------------
|  Jan|2018|      10|
|  Feb|2018|       0|
|  Mar|2018|       2|
|  Apr|2018|       0|
|  May|2018|       5|

有人知道怎么做吗?

更新

根据 D-Shih 答案代码,查询返回:

|month|year|quantity|
---------------------
|  Jan|2018|      10|
|  Feb|null|       0|
|  Mar|2018|       2|
|  Apr|null|       0|
|  May|2018|       5|

如果我添加一个不同年份的寄存器,它将只显示一个名称为 2017 的行,例如:

|month|year|quantity|
---------------------
|  Jan|2018|      10|
|  Feb|null|       0|
|  Mar|2018|       2|
|  Apr|null|       0|
|  May|2018|       5|
|  May|2017|       2|

它必须显示

|month|year|quantity|
---------------------
|  Jan|2018|      10|
|  Feb|2018|       0|
|  Mar|2018|       2|
|  Apr|2018|       0|
|  May|2018|       5|
|  Jan|2017|       0|
|  Feb|2017|       0|
|  Mar|2017|       0|
|  Apr|2017|       0|
|  May|2017|       2|

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    你可以尝试做一个日历表和OUTER JOIN基于日历表

    SELECT t1.month,
           y.year AS year,
           COUNT(t2.id) 
    FROM (
        SELECT 'Jan' month
        UNION ALL
        SELECT 'Feb' month
        UNION ALL
        SELECT 'Mar' month
        UNION ALL
        SELECT 'Apr' month
        UNION ALL
        SELECT 'May' month
    ) t1 
    CROSS JOIN (SELECT DISTINCT YEAR(date) FROM budgets) y  
    LEFT JOIN budgets t2 on t1.month = LEFT(MONTHNAME(t2.date), 3) 
       AND y.year = YEAR(t2.date)
    GROUP BY t1.month, y.year
    

    这是给您的示例。

    架构 (MySQL v8.0)

    CREATE TABLE budgets (
       `month` varchar(5),
       `year` int,
       quantity int
    );
    
    
    insert into budgets values ('Jan',2018,10);
    insert into budgets values ('Mar',2018,2);
    insert into budgets values ('May',2018,5);
    insert into budgets values ('May',2017,2);
    

    查询 #1

    | month | year | quantity |
    | ----- | ---- | -------- |
    | Jan   | 2018 | 10       |
    | Mar   | 2018 | 2        |
    | May   | 2018 | 5        |
    | May   | 2017 | 2        |
    | Jan   | 2017 | 0        |
    | Feb   | 2018 | 0        |
    | Feb   | 2017 | 0        |
    | Mar   | 2017 | 0        |
    | Apr   | 2018 | 0        |
    | Apr   | 2017 | 0        |
    

    View on DB Fiddle

    【讨论】:

    • 好的,它起作用了,但如果我有另一个年份的值,它也很重要。有可能计算不同年份吗?
    • 你的mysql版本是多少?
    • 现在是 5.7.14,我会在屏幕上发布编辑答案
    • 我已经更新了这个问题。你能分析一下吗?
    • @AlexandreHansen OK 等一下。
    【解决方案2】:

    如果您想扩大规模,我认为这应该可行。不过不太确定它的效率:

    SELECT a.month AS month, a.year AS year, COALESCE(b.quantity,0) AS quantity
    FROM
    (
       SELECT DISTINCT MONTH(date) AS month, YEAR(date) AS year
       FROM
       budgets
    ) a
    LEFT JOIN
    (
       SELECT MONTH(date) AS month, YEAR(date) AS year,
       COUNT(id) AS quantity
       FROM
       budgets
       GROUP BY MONTH(date), YEAR(date)
    ) b
    ON a.month = b.month AND a.year = b.year
    

    【讨论】:

    • 嗨,毗湿奴,代码从正常选择返回相同的值!
    猜你喜欢
    • 2018-03-02
    • 1970-01-01
    • 2011-03-21
    • 1970-01-01
    • 2016-11-05
    • 2015-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多