我需要帮助来try 透视从以下查询派生的表:

WITH RECURSIVE dates AS 
(
    SELECT start_date as period, end_date
    FROM progetti
    WHERE id = 1
    UNION ALL
    SELECT DATE_ADD(period, INTERVAL 1 MONTH), end_date
    FROM dates 
    WHERE period < end_date - INTERVAL 1 MONTH
)
SELECT DATE_FORMAT(d.period, '%m-%Y') AS period, COALESCE(total, 0) AS total, COALESCE(s.tipo,0) AS tipo
FROM dates d
LEFT JOIN (
  SELECT DATE_FORMAT(created_on, '%m-%Y') as 'period', 
  COUNT(items_header.id) as 'total' ,
  items_header.tipo 
  FROM items_header  
  WHERE progetto=1
  GROUP BY DATE_FORMAT(created_on, '%m-%Y')
) s on s.period = DATE_FORMAT(d.period, '%m-%Y');

并返回以下数据集:

period total tipo
01-2022 0 0
02-2022 0 0
03-2022 1 1
03-2022 1 3
04-2022 1 3
05-2022 3 1
06-2022 2 1
07-2022 0 0
08-2022 0 0
09-2022 0 0
10-2022 0 0
11-2022 0 0
12-2022 0 0

我试图建立的是一个不同的结果:

period tipo 1 tipo=2 tipo=3 tipo=4
01-2022 0 0 0 0
02-2022 0 0 0 0
03-2022 1 0 1 0
04-2022 0 0 1 0
05-2022 3 1 0 0
06-2022 2 0 0 0
07-2022 0 0 0 0
08-2022 0 0 0 0
09-2022 0 0 0 0
10-2022 0 0 0 0
11-2022 0 0 0 0
12-2022 0 0 0 0

因此,月份只重复一次,项目计数按列中的tipo拆分.我正在try 构建一个将填充chart.js图的数据集(每个tipo一行),我正在寻找如何在MySQL中构建它.

编辑: items_header表

ID created_on tipo
1 2022-03-03 1

依此类推(是票务系统表头表)

Item_Type_CATALOG表

id description
1 A
2 B
3 C
4 D

推荐答案

基本上它是一个简单的枢纽,因为只有5种类型,你可以很容易地添加更多的新的MAX(CASE WHEN行添加到最后SELECT

WITH RECURSIVE dates AS 
(
    SELECT start_date as period, end_date
    FROM progetti
    WHERE id = 1
    UNION ALL
    SELECT DATE_ADD(period, INTERVAL 1 MONTH), end_date
    FROM dates 
    WHERE period < end_date - INTERVAL 1 MONTH
), CTE aS (
SELECT DATE_FORMAT(d.period, '%m-%Y') AS period, COALESCE(total, 0) AS total, COALESCE(s.tipo,0) AS tipo
FROM dates d
LEFT JOIN (
  SELECT DATE_FORMAT(created_on, '%m-%Y') as 'period', 
  COUNT(items_header.id) as 'total' ,
  items_header.tipo 
  FROM items_header  
  WHERE progetto=1
  GROUP BY DATE_FORMAT(created_on, '%m-%Y'), items_header.tipo
) s on s.period = DATE_FORMAT(d.period, '%m-%Y'))
  SELECT 
  period
    ,MAX(CASE WHEN tipo = 1 THEN total ELSE 0 END) tipo_1
  ,MAX(CASE WHEN tipo = 2 THEN total ELSE 0 END) tipo_2
  ,MAX(CASE WHEN tipo = 3 THEN total ELSE 0 END) tipo_3
  ,MAX(CASE WHEN tipo = 4 THEN total ELSE 0 END) tipo_4
FROM CTE 
GROUP BY period
ORDER BY period
period tipo_1 tipo_2 tipo_3 tipo_4
01-2022 0 0 0 0
02-2022 0 0 0 0
03-2022 1 0 1 0
04-2022 0 0 1 0
05-2022 3 0 0 0
06-2022 2 0 0 0
07-2022 0 0 0 0
08-2022 0 0 0 0
09-2022 0 0 0 0
10-2022 0 0 0 0
11-2022 0 0 0 0
12-2022 0 0 0 0

fiddle

Mysql相关问答推荐

带负数的MySQL子字符串_索引

如何使用GROUP BY调优简单SQL查询

数组上的MySQL、JSON_CONTAINS用法

MySQL中如何对字符串进行算术运算?

为什么嵌套循环逻辑不能按预期工作

Eloquent:通过国外模型得到平均分

如何使用mysql更新列中的json数据

sequelize 中最好的更新方法是什么

检索按键列值分组的最新日期 (MySql)

过滤查询结果

插入二进制数据会导致Data too long for column...

更新和替换未加引号的 JSON 字符串

WHERE SQL 语句中的列顺序是否重要

Ansible 幂等 MySQL 安装 Playbook

如何通过一个查询批量更新 mysql 数据?

一次查询 MySQL 插入多行

MySQL行格式:固定和动态之间的区别?

我可以在 PHP 中使用 PDO 创建数据库吗?

Yii2 如何进行 where AND 或 OR 条件分组?

SELECT INTO 和未声明的变量错误