将MySql中的行转换为列,列转换为行

5
我有一个问题,需要将行与列进行转置。如果只是将行转置为列或者将列转置为行,那么我可以做到。
这是我的数据表:
UNIT|JAN|FEB|MAR|APR|MEI|JUN
CS-1|100|200|300|400|500|600
CS-2|111|222|333|444|555|666
CS-3|331|123|423|923|918|123

and I would like to get the following output

MONTH|CS-1|CS-2|CS-3
JAN  |100 |111 |331
FEB  |200 |222 |123
MAR  |300 |333 |423

有人知道如何做到这一点吗?非常感谢!

1
这个并没有太多意义。假设你真的有一个适当的表格,那么它将会有任意数量的行,变成任意数量的列。Mysql 对于你可以拥有的列数是有限制的。你为什么想要这样做呢? - user1864610
1个回答

5
你可以这样做。
SELECT month,
       MAX(CASE WHEN unit = 'CS-1' THEN value END) `CS-1`,
       MAX(CASE WHEN unit = 'CS-2' THEN value END) `CS-2`,
       MAX(CASE WHEN unit = 'CS-3' THEN value END) `CS-3`
  FROM
(
  SELECT unit, month,
         CASE month 
            WHEN 'JAN' THEN jan
            WHEN 'FEB' THEN feb
            WHEN 'MAR' THEN mar
            WHEN 'APR' THEN apr
            WHEN 'MAY' THEN may
            WHEN 'JUN' THEN jun
         END value
    FROM table1 t CROSS JOIN
  (
    SELECT 'JAN' month UNION ALL
    SELECT 'FEB' UNION ALL
    SELECT 'MAR' UNION ALL
    SELECT 'APR' UNION ALL
    SELECT 'MAY' UNION ALL
    SELECT 'JUN'
  ) c
) q
 GROUP BY month
 ORDER BY FIELD(month, 'JAN', 'FEB', 'MAR', 'APR', 'MAY', 'JUN')

输出:

| 月份 | CS-1 | CS-2 | CS-3 |
|-------|------|------|------|
|   一月 |  100 |  111 |  331 |
|   二月 |  200 |  222 |  123 |
|   三月 |  300 |  333 |  423 |
|   四月 |  400 |  444 |  923 |
|   五月 |  500 |  555 |  918 |
|   六月 |  600 |  666 |  123 |

这是一个 SQLFiddle 演示。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接