人:'帮我改一下下面的 SQL 语句,要求能显示出对应的月份

**AI:**好的,以下是更新后的三个 SQL 查询语句,用于查询从当前时间往前一年内每个月的销售额、卖出商品数和新增用户数,即使该月没有任何销售或新增也会被显示出来:

  1. 查询过去一年每个月的销售额:
SELECT 
    DATE_FORMAT(date_table.month, '%Y-%m') AS month,
    IFNULL(SUM(total), 0) AS sales_amount
FROM 
    (SELECT 
        DATE_FORMAT((CURDATE() - INTERVAL (a.a + (10 * b.a) + (100 * c.a)) MONTH), '%Y-%m') AS month
    FROM 
        (SELECT 0 AS a UNION SELECT 1 AS a UNION SELECT 2 AS a UNION SELECT 3 AS a UNION SELECT 4 AS a UNION SELECT 5 AS a UNION SELECT 6 AS a UNION SELECT 7 AS a UNION SELECT 8 AS a UNION SELECT 9 AS a) AS a
    CROSS JOIN 
        (SELECT 0 AS a UNION SELECT 1 AS a UNION SELECT 2 AS a UNION SELECT 3 AS a UNION SELECT 4 AS a UNION SELECT 5 AS a UNION SELECT 6 AS a UNION SELECT 7 AS a UNION SELECT 8 AS a UNION SELECT 9 AS a) AS b
    CROSS JOIN 
        (SELECT 0 AS a UNION SELECT 1 AS a UNION SELECT 2 AS a UNION SELECT 3 AS a UNION SELECT 4 AS a UNION SELECT 5 AS a UNION SELECT 6 AS a UNION SELECT 7 AS a UNION SELECT 8 AS a UNION SELECT 9 AS a) AS c) date_table
LEFT JOIN 
    orders ON DATE_FORMAT(created_at, '%Y-%m') = date_table.month
        AND created_at BETWEEN DATE_SUB(NOW(), INTERVAL 1 YEAR) AND NOW()
GROUP BY 
    month;
  1. 查询过去一年每个月的卖出商品数:
SELECT 
    DATE_FORMAT(date_table.month, '%Y-%m') AS month,
    IFNULL(SUM(oi.quantity), 0) AS sold_items
FROM 
    (SELECT 
        DATE_FORMAT((CURDATE() - INTERVAL (a.a + (10 * b.a) + (100 * c.a)) MONTH), '%Y-%m') AS month
    FROM 
        (SELECT 0 AS a UNION SELECT 1 AS a UNION SELECT 2 AS a UNION SELECT 3 AS a UNION SELECT 4 AS a UNION SELECT 5 AS a UNION SELECT 6 AS a UNION SELECT 7 AS a UNION SELECT 8 AS a UNION SELECT 9 AS a) AS a
    CROSS JOIN 
        (SELECT 0 AS a UNION SELECT 1 AS a UNION SELECT 2 AS a UNION SELECT 3 AS a UNION SELECT 4 AS a UNION SELECT 5 AS a UNION SELECT 6 AS a UNION SELECT 7 AS a UNION SELECT 8 AS a UNION SELECT 9 AS a) AS b
    CROSS JOIN 
        (SELECT 0 AS a UNION SELECT 1 AS a UNION SELECT 2 AS a UNION SELECT 3 AS a UNION SELECT 4 AS a UNION SELECT 5 AS a UNION SELECT 6 AS a UNION SELECT 7 AS a UNION SELECT 8 AS a UNION SELECT 9 AS a) AS c) date_table
LEFT JOIN 
    orders o ON DATE_FORMAT(o.created_at, '%Y-%m') = date_table.month
        AND o.created_at BETWEEN DATE_SUB(NOW(), INTERVAL 1 YEAR) AND NOW()
LEFT JOIN 
    order_items oi ON o.id = oi.order_id
GROUP BY 
    month;
  1. 查询过去一年每个月的新增用户数:
SELECT 
    DATE_FORMAT(date_table.month, '%Y-%m') AS month,
    IFNULL(COUNT(u.id), 0) AS new_users
FROM 
    (SELECT 
        DATE_FORMAT((CURDATE() - INTERVAL (a.a + (10 * b.a) + (100 * c.a)) MONTH), '%Y-%m') AS month
    FROM 
        (SELECT 0 AS a UNION SELECT 1 AS a UNION SELECT 2 AS a UNION SELECT 3 AS a UNION SELECT 4 AS a UNION SELECT 5 AS a UNION SELECT 6 AS a UNION SELECT 7 AS a UNION SELECT 8 AS a UNION SELECT 9 AS a) AS a
    CROSS JOIN 
        (SELECT 0 AS a UNION SELECT 1 AS a UNION SELECT 2 AS a UNION SELECT 3 AS a UNION SELECT 4 AS a UNION SELECT 5 AS a UNION SELECT 6 AS a UNION SELECT 7 AS a UNION SELECT 8 AS a UNION SELECT 9 AS a) AS b
    CROSS JOIN 
        (SELECT 0 AS a UNION SELECT 1 AS a UNION SELECT 2 AS a UNION SELECT 3 AS a UNION SELECT 4 AS a UNION SELECT 5 AS a UNION SELECT 6 AS a UNION SELECT 7 AS a UNION SELECT 8 AS a UNION SELECT 9 AS a) AS c) date_table
LEFT JOIN 
    users u ON DATE_FORMAT(u.created_at, '%Y-%m') = date_table.month
        AND u.created_at BETWEEN DATE_SUB(NOW(), INTERVAL 1 YEAR) AND NOW()
GROUP BY 
    month;

这些 SQL 语句使用了一个子查询 date_table 来生成过去一年每个月的月份,然后使用 LEFT JOIN 将其与 ordersorder_itemsusers 表连接,最后使用 IFNULL 函数将没有销售记录或新增用户的月份的销售额、卖出商品数和新增用户数设置为 0。

希望这些信息对您有所帮助!

SQL 查询过去一年每个月的销售额、商品数和新增用户数

原文地址: https://www.cveoy.top/t/topic/ol3G 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录