Yar*_*arp 1 mysql sql pivot aggregate pivot-table
我有一个只有两列的表,如下所示
mysql> select * from stuff_table;
+------+-------+
| name | stuff |
+------+-------+
| John | shoes |
| Jim | bag |
| Ely | book |
| Tom | bag |
| Will | shoes |
| Pitt | book |
| Dean | bag |
| Luke | bag |
+------+-------+
Run Code Online (Sandbox Code Playgroud)
我尝试了很多我发现的解决方案
select distinct
max(case when stuff='shoes' then name else name is null) end as shoes,
max(case when stuff='bag' then name else name is null end) as bag,
max(case when stuff='book' then name else name is null end) as book
from stuff_table;
Run Code Online (Sandbox Code Playgroud)
但我刚刚得到这个
+-------+------+------+
| shoes | bag | book |
+-------+------+------+
| Will | Tom | Pitt |
+-------+------+------+
Run Code Online (Sandbox Code Playgroud)
相反,我想得到这个
+-------+------+------+
| shoes | bag | book |
+-------+------+------+
| John | Jim | Ely |
| Will | Tom | Pitt |
| NULL | Dean | NULL |
| NULL | Luke | NULL |
+-------+------+------+
Run Code Online (Sandbox Code Playgroud)
我也尝试过 sum(case...) 或 if(case..) 或 group by ,但它不起作用。有没有mysql查询可以得到这样的表?请帮忙。谢谢。
根据mysql您使用的版本,这是一种建立row_number每个组的方法,然后使用conditional aggregation按该行号进行分组:
select
rn,
max(case when stuff = 'bag' then name end) 'bag',
max(case when stuff = 'book' then name end) 'book',
max(case when stuff = 'shoes' then name end) 'shoes'
from (
select *, row_number() over (partition by stuff order by name) rn
from stuff_table
) t
group by rn
Run Code Online (Sandbox Code Playgroud)
由于您使用的是旧版本的mysql,因此您需要使用user-defined variables来建立行号。然后其余部分的工作方式相同。这是一个例子:
select
rn,
max(case when stuff = 'bag' then name end) 'bag',
max(case when stuff = 'book' then name end) 'book',
max(case when stuff = 'shoes' then name end) 'shoes'
from (
select *,
( case stuff
when @curStuff
then @curRow := @curRow + 1
else @curRow := 1 and @curStuff := stuff
end
) + 1 AS rn
from stuff_table, (select @curRow := 0, @curStuff := '') r
order by stuff
) t
group by rn
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6350 次 |
| 最近记录: |