从 MySql 中的查询数据透视表中清除空值

Che*_*ema 0 mysql sql pivot pivot-table

我有以下数据集作为 MySql 引擎版本 5.x 中的示例

+-----------+------------+
| name      | occupation |
+-----------+------------+
| Samantha  | Doctor     |
| Julia     | Actor      |
| Maria     | Actor      |
| Meera     | Singer     |
| Ashely    | Professor  |
| Ketty     | Professor  |
| Christeen | Professor  |
| Jane      | Actor      |
| Jenny     | Doctor     |
| Priya     | Singer     |
+-----------+------------+
Run Code Online (Sandbox Code Playgroud)

我想旋转表中的职业列,以便每个名称按字母顺序排序并显示在其相应的职业下方。输出列标题应分别为 Doctor、Professor、Singer 和 Actor。

我试试这个

SELECT CASE occupation WHEN 'Doctor' THEN name END AS Doctor,
       CASE occupation WHEN 'Professor' THEN name END AS Professor,
       CASE occupation WHEN 'Singer' THEN name END AS Singer,
       CASE occupation WHEN 'Actor' THEN name END AS Actor
FROM occupations;
Run Code Online (Sandbox Code Playgroud)

输出

+----------+-----------+--------+-------+
| Doctor   | Professor | Singer | Actor |
+----------+-----------+--------+-------+
| NULL     | NULL      | NULL   | Jane  |
| NULL     | NULL      | NULL   | Julia |
| NULL     | NULL      | NULL   | Maria |
| NULL     | NULL      | Meera  | NULL  |
| NULL     | NULL      | Priya  | NULL  |
| NULL     | Ashely    | NULL   | NULL  |
| NULL     | Christeen | NULL   | NULL  |
| NULL     | Ketty     | NULL   | NULL  |
| Jenny    | NULL      | NULL   | NULL  |
| Samantha | NULL      | NULL   | NULL  |
+----------+-----------+--------+-------+
Run Code Online (Sandbox Code Playgroud)

但我想要这个输出

Doctor   Professor  Singer Actor
Jenny    Ashley     Meera  Jane
Samantha Christeen  Priya  Julia
NULL     Ketty      NULL   Maria
Run Code Online (Sandbox Code Playgroud)

我对此很困惑,任何帮助将不胜感激。

Gor*_*off 5

这有点棘手。您需要聚合,但没有任何可聚合的内容。为此,您需要一个行号:

SELECT MAX(CASE occupation WHEN 'Doctor' THEN name END) AS Doctor,
       MAX(CASE occupation WHEN 'Professor' THEN name END) AS Professor,
       MAX(CASE occupation WHEN 'Singer' THEN name END) AS Singer,
       MAX(CASE occupation WHEN 'Actor' THEN name END) AS Actor
FROM (SELECT o.*,
             ROW_NUMBER() OVER (PARTITION BY occupation ORDER BY occupation) as seqnum
      FROM occupations o
     ) o
GROUP BY seqnum;
Run Code Online (Sandbox Code Playgroud)

是一个 db<>fiddle,说明了上面的工作原理。

编辑:

在旧版本中,您可以使用相关子查询:

SELECT MAX(CASE occupation WHEN 'Doctor' THEN name END) AS Doctor,
       MAX(CASE occupation WHEN 'Professor' THEN name END) AS Professor,
       MAX(CASE occupation WHEN 'Singer' THEN name END) AS Singer,
       MAX(CASE occupation WHEN 'Actor' THEN name END) AS Actor
FROM (SELECT o.*,
             (SELECT COUNT(*)
              FROM occupations o2
              WHERE o2.occupation = o.occupation AND
                    o2.name <= o.name
             ) as seqnum
      FROM occupations o
     ) o
GROUP BY seqnum;
Run Code Online (Sandbox Code Playgroud)