根据条件将查询数据合并到一行中

wwwo4jvm  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(244)

关闭。这个问题需要更加突出重点。它目前不接受答案。
**想改进这个问题吗?**通过编辑这篇文章更新这个问题,使它只关注一个问题。

两年前关门了。
改进这个问题
我有以下资料

code1  code2  new_status  created_at   old_status
A       1        S2        x            S1
A       1        S3        y            s2
A       1        S4        z            S3
B       2        S3        P            S1

我希望在查询后按以下方式获取数据

code1   code2   S1   S1_date  S2   S2_date   s3   s3_date   s4    s4_date
A        1       0      0      1    x         1     y        1        z
B        2       0      0      0    0         1     P        0        0

我目前正在使用case区分不同的状态,但是每个状态得到不同的行。我想要上面所示的组合。

mcvgt66p

mcvgt66p1#

在mysql中实现这一点不是一个好主意,因为据我所知mysql不支持pivot。
但是,您仍然可以使用下面的sql只在mysql中获得您想要的结果。
sql语句:

select code1,code2,
       max(case when new_status='S1' then 1 else 0 end) S1,
       max(case when new_status='S1' then created_dt else 0 end) S1_date,
       max(case when new_status='S2' then 1 else 0 end) S2,
       max(case when new_status='S2' then created_dt else 0 end) S2_date,
       max(case when new_status='S3' then 1 else 0 end) S3,
       max(case when new_status='S3' then created_dt else 0 end) S3_date,
       max(case when new_status='S4' then 1 else 0 end) S4,
       max(case when new_status='S4' then created_dt else 0 end) S4_date
from xyz
group by code1,code2;

从示例数据到输出的示例:

mysql> create table xyz(code1 varchar(20),code2 varchar(20),new_status varchar(20),created_dt varchar(20),old_status varchar(20));
Query OK, 0 rows affected (0.46 sec)

mysql> insert into xyz values
    -> ('A','1','S2','x','S1'),
    -> ('A','1','S3','y','s2'),
    -> ('A','1','S4','z','S3'),
    -> ('B','2','S3','P','S1');
Query OK, 4 rows affected (0.05 sec)
Records: 4  Duplicates: 0  Warnings: 0

mysql> 
mysql> select code1,code2,
    ->        max(case when new_status='S1' then 1 else 0 end) S1,
    ->        max(case when new_status='S1' then created_dt else 0 end) S1_date,
    ->        max(case when new_status='S2' then 1 else 0 end) S2,
    ->        max(case when new_status='S2' then created_dt else 0 end) S2_date,
    ->        max(case when new_status='S3' then 1 else 0 end) S3,
    ->        max(case when new_status='S3' then created_dt else 0 end) S3_date,
    ->        max(case when new_status='S4' then 1 else 0 end) S4,
    ->        max(case when new_status='S4' then created_dt else 0 end) S4_date
    -> from xyz
    -> group by code1,code2;
+-------+-------+------+---------+------+---------+------+---------+------+---------+
| code1 | code2 | S1   | S1_date | S2   | S2_date | S3   | S3_date | S4   | S4_date |
+-------+-------+------+---------+------+---------+------+---------+------+---------+
| A     | 1     |    0 | 0       |    1 | x       |    1 | y       |    1 | z       |
| B     | 2     |    0 | 0       |    0 | 0       |    1 | P       |    0 | 0       |
+-------+-------+------+---------+------+---------+------+---------+------+---------+
2 rows in set (0.00 sec)

相关问题