我有一个表 struct 如下:

store 排行榜:

id shop_name
1 My Shop
2 Another Shop
3 Final Shop

订单表:

shop_id order_id data created_at
1 123 json 01/01/2023
2 456 json 01/01/2023
3 234 json 02/02/2023
1 765 json 03/02/2023
2 435 json 04/03/2023
3 788 json 04/03/2023

从这两个表中,我想 Select store 名称、ID和按创建月份分组的订单计数,如下所示:

shop_id shop_name order_count_january_23 order_count_february_23 etc
1 My Shop 1 2 ...
2 Another Shop 12 45 ...
3 Final Shop 8 36 ...

我已经try 对订单数量进行分组,但似乎无法获得所需的确切输出,我还try 使用子查询,但无济于事.

SELECT orders.id,
       shops.name,
       count(orders.id) as 'Orders',
       MONTH(orders.created_at) as Month,
       YEAR(orders.created_at) as Year
FROM orders
JOIN shops on shops.id = orders.id
GROUP BY orders.wholesaler_id, Year, Month

我知道上面的方法不起作用,但这就是我被难住的地方.然而,它确实给了我一份具有三个订单编号的store 列表,但格式不正确

任何帮助我们都将不胜感激.

推荐答案

FOR MYSQL

SET SESSION group_concat_max_len = 1000000;

SET @columns = NULL;

SELECT GROUP_CONCAT(
    DISTINCT CONCAT(
        'SUM(CASE WHEN MONTH = ', MONTH, 
        ' AND YEAR = ', YEAR, 
        ' THEN 1 ELSE 0 END) AS order_count_', 
        MONTHNAME, '_', YEAR
    )
    SEPARATOR ', '
) INTO @columns
FROM (
    SELECT DISTINCT MONTH(created_at) AS MONTH, YEAR(created_at) AS YEAR, 
           MONTHNAME(created_at) AS MONTHNAME
    FROM Orders
) AS months;

SET @sql = CONCAT('SELECT 
                    s.ID AS shop_id,
                    s.shop_name,
                    ', @columns, '
                  FROM
                    shops s
                  LEFT JOIN (
                      SELECT shop_id, 
                             MONTH(created_at) AS MONTH, 
                             YEAR(created_at) AS YEAR
                      FROM orders
                      GROUP BY shop_id, MONTH(created_at), YEAR(created_at)
                  ) o ON s.ID = o.shop_id
                  GROUP BY
                    s.ID, s.shop_name');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

FOR MSSQL

DECLARE @columns NVARCHAR(MAX);
DECLARE @sql NVARCHAR(MAX);

-- Generate a comma-separated list of aggregated expressions for each month and year
SELECT @columns = COALESCE(@columns + ', ', '') +
                 'SUM(CASE WHEN MONTH = ' + CONVERT(NVARCHAR(2), MONTH) + 
                 ' AND YEAR = ' + CONVERT(NVARCHAR(4), YEAR) + 
                 ' THEN 1 ELSE 0 END) AS order_count_' + MONTHNAME + '_' + CONVERT(NVARCHAR(4), YEAR)
FROM (
  SELECT DISTINCt MONTH(created_at) AS MONTH, YEAR(created_at) AS YEAR, FORMAT(created_at, 'MMMM') AS MONTHNAME
  FROM Orders
) AS months;

-- Construct the dynamic SQL query
SET @sql = CONCAT('SELECT 
                    s.id AS shop_id,
                    s.shop_name,
                    ', @columns, '
                  FROM
                    Shops s
                  LEFT JOIN (
                      SELECT shop_id, 
                             MONTH(created_at) AS MONTH, 
                             YEAR(created_at) AS YEAR
                      FROM Orders
                      GROUP BY shop_id, MONTH(created_at), YEAR(created_at)
                  ) o ON s.id = o.shop_id
                  GROUP BY
                    s.id, s.shop_name');

-- Execute the dynamic SQL query
EXEC sp_executesql @sql;

Mysql相关问答推荐

是否有一种方法可以在mysql中设置一列,使其自动成为该行的行号的值?

表列中的SQL SUM MENY值记录单个查询

根据现有行 Select 月份日期

如何在 MySQL 中对同一个表的多个列进行 INNER JOIN

错误 2020 (HY000): 数据包大于 'max_allowed_pa​​cket' 字节,docker 容器内出现 mysql 错误

mysql 代码给我的外键格式不正确

使用 presto 或 mysql 添加每个组中的缺失值

如何进行查询以在两个不同的列中搜索两个不同的数据字符串?

MySQL如何将字符串列表与子查询进行比较

如何获取每日登录用户数?

将sql查询转换为sequelize

MySQL - 单词边界的正则表达式,不包括下划线(连接标点符号)

总行大小不超过 65535,但我得到行大小太大.所用表类型的最大行大小,不包括 BLOB,是 65535错误

如何查看 rdsadmin 在 mysql 实例上的权限?

如何在 MySQL 中搜索多个列?

函数 mysql_real_escape_string 的 PDO 类似功能是什么?

脚本超时,如果要完成导入,请重新提交相同的文件,导入将恢复

我可以在单个 Amazon RDS 实例上创建多少个数据库

在mysql中复制没有数据的数据库 struct (带有空表)

如何从命令行调用带有参数的mysql存储过程?