[英]mySQL pivoting a table . Removing NULL values
所以我必须给 pivot 一个表,并将所有缺失的值替换为 null。 当我尝试对新列进行排序时,问题就开始了。 所有 null 值都在开头,有没有办法让我以某种方式修剪列的总长度或排除 Null 直到达到第一个名称?
这是问题所在: Pivot OCCUPATIONS 中的 Occupation 列,以便每个 Name 按字母顺序排序并显示在其对应的 Occupation 下方。 output 列标题应分别为 Doctor、Professor、Singer 和 Actor。
注意:当没有更多与职业对应的名称时,打印 NULL。
表格概览: https://i.stack.imgur.com/48zB1.png
样本输入为: https://i.stack.imgur.com/LLh5g.png
到目前为止我尝试了什么:
SELECT
CASE WHEN occupation = 'Doctor' THEN name END AS col1,
CASE WHEN occupation = 'Professor' THEN name END as col2,
CASE WHEN occupation = 'Singer' THEN name END as col3,
CASE WHEN occupation = 'Actor' THEN name END as col4
FROM OCCUPATIONS
GROUP BY occupation,name
order by col1,col2,col3,col4 ASC;
我得到了什么:
NULL NULL NULL Eve
NULL NULL NULL Jennifer
NULL NULL NULL Ketty
NULL NULL NULL Samantha
NULL NULL Christeen NULL
NULL NULL Jane NULL
NULL NULL Jenny NULL
NULL NULL Kristeen NULL
NULL Ashley NULL NULL
NULL Belvet NULL NULL
NULL Britney NULL NULL
NULL Maria NULL NULL
NULL Meera NULL NULL
NULL Naomi NULL NULL
NULL Priyanka NULL NULL
Aamina NULL NULL NULL
Julia NULL NULL NULL
Priya NULL NULL NULL
我想要回来的例子:
Jenny Ashley Meera Jane
Samantha Christeen Priya Julia
NULL Ketty NULL Maria
分配一个行号并按它分组
drop table if exists t;
create table t(name varchar(1), occupation varchar(2));
insert into t values
('b','dr'),('a','dr'),('c','dr'),
('z','ok'),('a','ok');
with cte as
(select name, occupation,
row_number() over (partition by occupation order by name) rn
from t)
select rn,
max(case when occupation = 'dr' then name else null end) 'dr',
max(case when occupation = 'ok' then name else null end) 'ok'
from cte
group by rn;
+----+------+------+
| rn | dr | ok |
+----+------+------+
| 1 | a | a |
| 2 | b | z |
| 3 | c | NULL |
+----+------+------+
3 rows in set (0.023 sec)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.