mysql - 如何根据值将多行转换为多列

标签 mysql database pivot

我知道它是重复的,但我很困惑。我不擅长数据库。

我知道可以通过代码轻松处理它。但请求是为了查询,这就是我要走这条路的原因。

我通过此查询获得了如下数据

**SELECT c.CASE_NUMBER,mt.MAIN_TEST_NAME, t.TASK_START, t.TASK_END FROM `CASE` c 
INNER JOIN MAIN_TEST mt ON c.CASE_ID=mt.CASE_ID
INNER JOIN JOB j on c.CASE_ID = j.JOB_ID
INNER JOIN TASK t on j.TASK_ID= t.TASK_ID
WHERE  (c.CREATION_DATE BETWEEN '2019-01-01 00:00:00' AND CURDATE() )** 

CASE NUMBER     MAIN TEST   TASK_START          TASK_END
09232           BX          11/8/2019 14:40     11/8/2019 15:40
09232           FH          11/8/2019 13:35     11/8/2019 15:12
09234           FH          11/6/2019 12:54     11/6/2019 14:54
09234           BX          11/6/2019 11:23     11/6/2019 13:44

我尝试了以下查询,

**SELECT c.CASE_NUMBER,
   (CASE WHEN mt.MAIN_TEST_NAME='BX' THEN t.TASK_START END) as 'BX_START_DATE',
   (CASE WHEN mt.MAIN_TEST_NAME='FH' THEN t.TASK_START END) as 'FH_START_DATE'
FROM `CASE` c
INNER JOIN MAIN_TEST mt ON c.CASE_ID=mt.CASE_ID
INNER JOIN JOB j on c.CASE_ID = j.JOB_ID
INNER JOIN TASK t on j.TASK_ID= t.TASK_ID
WHERE  (c.CREATION_DATE BETWEEN '2019-01-01 00:00:00' AND CURDATE() )**

但是在这个查询中,我对如何在条件为真时创建 TASK_END 列感到困惑。

我想要这种格式的数据。

CASE NUMBER     BX_TASK_START       BX_TASK_END           FH_TASK_START       FH_TASK_END
09232           11/8/2019 14:40     11/8/2019 15:40       11/8/2019 13:35     11/8/2019 15:12
09234           11/6/2019 11:23     11/6/2019 13:44       11/6/2019 12:54     11/6/2019 14:54

最佳答案

您必须聚合这些 case 表达式:

SELECT c.CASE_NUMBER,
   MAX(CASE WHEN mt.MAIN_TEST_NAME='BX' THEN t.TASK_START END) as 'BX_TASK_START',
   MAX(CASE WHEN mt.MAIN_TEST_NAME='BX' THEN t.TASK_END END) as 'BX_TASK_END',
   MAX(CASE WHEN mt.MAIN_TEST_NAME='FH' THEN t.TASK_START END) as 'FH_TASK_START',
   MAX(CASE WHEN mt.MAIN_TEST_NAME='FH' THEN t.TASK_END END) as 'FH_TASK_END'
FROM `CASE` c    
INNER JOIN MAIN_TEST mt ON c.CASE_ID=mt.CASE_ID
INNER JOIN JOB j on c.CASE_ID = j.JOB_ID
INNER JOIN TASK t on j.TASK_ID= t.TASK_ID
WHERE  (c.CREATION_DATE BETWEEN '2019-01-01 00:00:00' AND CURDATE())
GROUP BY c.CASE_NUMBER 

关于mysql - 如何根据值将多行转换为多列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59466289/

相关文章:

php - 如何用一些数学更新 MySQL 表?

mysql - 如何将uuid存储为数字?

r - 使用数据库时 dplyr 加入 : How do you do a non standard join `col1` ! = `col2`?

database - 从 MS-Access 中的两个表中检索超过 250 个字段

HTML5 : Image rotating around pivot, 方向错误

javascript - 使用 php 和 mysql 表单上的多个搜索字段

python - DJANGO 在保存时添加 NULL - IntegrityError at/****/(1048, "***' 不能为 null")

XML 与 JSON 来表示数据库数据

按 id reshape 并保持其他变量固定

sql - 使用旋转将行转换为列