我在将行转换为列和将列转换为行时遇到问题。 如果它只是将行转换为列或列转换为行,我可以这样做。
这是我的数据表
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
我希望获得以下输出
MONTH|CS-1|CS-2|CS-3
JAN |100 |111 |331
FEB |200 |222 |123
MAR |300 |333 |423
等。
有人知道怎么做吗?非常感谢!
答案 0 :(得分:4)
你可以这样做
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')
输出:
| MONTH | CS-1 | CS-2 | CS-3 | |-------|------|------|------| | JAN | 100 | 111 | 331 | | FEB | 200 | 222 | 123 | | MAR | 300 | 333 | 423 | | APR | 400 | 444 | 923 | | MAY | 500 | 555 | 918 | | JUN | 600 | 666 | 123 |
这是 SQLFiddle 演示