我正在尝试将行值转换为列。这意味着我的桌子上有行号和缝纫机。它显示了哪台缝纫机的行号。所以我希望行号作为列来显示每行上的机器。应该有多个重复值,我想将它们全部显示出来。
请注意 - 抱歉我的英语不好
现有表(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
桌子枢轴可能会很痛苦。这是一种可能的方法。它需要将具有行号的每个数据透视列排序到表中,然后使用匹配的行号在这些表上执行 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
。我将其作为占位符写在我们的查询中。