如何将行值转换为列 - MySql

问题描述 投票:0回答:1

我正在尝试将行值转换为列。这意味着我的桌子上有行号和缝纫机。它显示了哪台缝纫机的行号。所以我希望行号作为列来显示每行上的机器。应该有多个重复值,我想将它们全部显示出来。

请注意 - 抱歉我的英语不好

现有表(1000+条记录)

身份证 条形码 机器_类型 线
1 1125 之字形 L01
2 1111 之字形 L01
3 1255 拉拔器 L02
4 8569 单针 L05
5 6589 双针 L01
6 4589 内存 L04

这就是我想要的输出

L01 L02 L03 L04
拉拔器 之字形 之字形 单针
拉拔器 双针 之字形 内存
内存 内存 拉拔器 之字形
双针 内存 单针 双针
单针 之字形 双针 内存
双针 内存 内存 拉拔器

我尝试了这个,但它没有按照我的预期提供输出

SELECT 
         (CASE WHEN `line` = 'L01' THEN machine_type ELSE null END) AS `Line 1`,
         (CASE WHEN `line` = 'L02' THEN machine_type ELSE null END) AS `Line 2`
  FROM   dr_scan
  WHERE scan_freq=2

请参考附件数据库表图片

mysql mysqli mysql-workbench
1个回答
0
投票

桌子枢轴可能会很痛苦。这是一种可能的方法。它需要将具有行号的每个数据透视列排序到表中,然后使用匹配的行号在这些表上执行 OUTTER JOIN。
首先,让我们建立一个基表。

create table dr_scan(ID int,    Barcode int,    Machine_Type varchar(20),   Line char(3));

insert dr_scan values
(1,1125,'Zigzag','L01'),
(2,1111,'Zigzag','L01'),
(3,1255,'Puller','L02'),
(4,8569,'Single Needle','L05'),
(5,6589,'Double Needle','L01'),
(6,4589,'RAM','L04'),
(7,7589,'Puller','L04'),
(8,3589,'RAM','L04'),
(9,2589,'Double Needle','L04'),
(10,1589,'RAM','L04');

select * from dr_scan;
-- result 
+------+---------+---------------+------+
| ID   | Barcode | Machine_Type  | Line |
+------+---------+---------------+------+
|    1 |    1125 | Zigzag        | L01  |
|    2 |    1111 | Zigzag        | L01  |
|    3 |    1255 | Puller        | L02  |
|    4 |    8569 | Single Needle | L05  |
|    5 |    6589 | Double Needle | L01  |
|    6 |    4589 | RAM           | L04  |
|    7 |    7589 | Puller        | L04  |
|    8 |    3589 | RAM           | L04  |
|    9 |    2589 | Double Needle | L04  |
|   10 |    1589 | RAM           | L04  |
+------+---------+---------------+------+

现在我们要决定哪一行的行数和计数值最多:

select line,count(*) ct
from dr_scan
group by line
order by ct desc
limit 1
;
-- result
+------+----+
| line | ct |
+------+----+
| L04  |  5 |
+------+----+

现在我们知道第

L04
行有最多的行。因此,基于行
l4
的名为
L04
的派生表应用作一系列 LEFT OUTTER JOIN 中的最左边的表。

select l1.machine_type as L01,
l2.machine_type as L02,
l3.machine_type as L03,
l4.machine_type as L04,
l5.machine_type as L05
from        (select line,row_number() over (order by id) as row_num,machine_type
            from dr_scan
            where line='L04') l4
left join  (select line,row_number() over (order by id) as row_num,machine_type
            from dr_scan
            where line='L01') l1
on l4.row_num=l1.row_num
left join  (select line,row_number() over (order by id) as row_num,machine_type
            from dr_scan
            where line='L02') l2
on l4.row_num=l2.row_num
left join  (select line,row_number() over (order by id) as row_num,machine_type
            from dr_scan
            where line='L03') l3
on l4.row_num=l3.row_num
left join  (select line,row_number() over (order by id) as row_num,machine_type
            from dr_scan
            where line='L05') l5
on l4.row_num=l5.row_num
;

-- result
+---------------+--------+------+---------------+---------------+
| L01           | L02    | L03  | L04           | L05           |
+---------------+--------+------+---------------+---------------+
| Zigzag        | Puller | NULL | RAM           | Single Needle |
| Zigzag        | NULL   | NULL | Puller        | NULL          |
| Double Needle | NULL   | NULL | RAM           | NULL          |
| NULL          | NULL   | NULL | Double Needle | NULL          |
| NULL          | NULL   | NULL | RAM           | NULL          |
+---------------+--------+------+---------------+---------------+

通过为每个行表定义的行号(基于 id 的顺序)用作连接条件,结果表中每个枢轴列的值都被排序。请注意,在我们的测试样本中,

L03
列中没有
line
。我将其作为占位符写在我们的查询中。

© www.soinside.com 2019 - 2024. All rights reserved.