我希望使用下表并以下面概述的格式表示数据。
所有Type A dates
作为Date 1
列,Type B dates
作为Date 2
列。 Type A
的行数总是比Type B
多,因此对于任何丢失的行,我都需要包含null。
我不确定这是什么类型的转换,可能会引起误解。
查询可以用mysql> = 5.7
编写Type A -> Date 1
Type B -> Date 2
------------------
| Table |
-----------------|
| type | date |
| A | 2019-01 |
| A | 2019-02 |
| A | 2019-03 |
| A | 2019-04 |
| B | 2018-10 |
| B | 2018-11 |
------------------
我想将数据转换为以下内容:
------------------------
| Date 1 | Date 2 |
| 2019-01 | 2018-10 |
| 2019-02 | 2018-11 |
| 2019-03 | null |
| 2019-04 | null |
-------------------------
答案 0 :(得分:3)
尝试类似的方法,mysql没有行号或等级函数,这很痛苦,但是可以通过类似的方法实现
SET @row_number_a = 0;
SET @row_number_b = 0;
SELECT * FROM
(SELECT
(@row_number_a:=@row_number_a + 1) AS rn, date
FROM test
WHERE type = 'A'
ORDER BY date DESC) a
LEFT JOIN
(SELECT
(@row_number_b:=@row_number_b + 1) AS rn, date
FROM test
WHERE type = 'B'
ORDER BY date DESC) b
ON a.rn = b.rn
答案 1 :(得分:2)
在MySQL 8+中,您可以使用ROW_NUMBER()
对行进行排序,然后将B
日期与相应的A
日期结合起来。请注意,如果您的B
日期比A
日期多,则需要一个FULL JOIN
,该日期在MySQL中不可用,但可以由{{ 1}}和UNION
。如果不是这种情况,则可以从LEFT JOIN
开始删除查询的一部分。
RIGHT JOIN
输出
UNION
Demo on dbfiddle(这也表明WITH a AS (SELECT ROW_NUMBER() OVER (ORDER BY `date`) AS `row`, `date`
FROM table1
WHERE type = 'A'),
b AS (SELECT ROW_NUMBER() OVER (ORDER BY `date`) AS `row`, `date`
FROM table1
WHERE type = 'B')
SELECT a.date AS `Date 1`, b.date AS `Date 2`
FROM a
LEFT JOIN b ON b.row = a.row
UNION
SELECT a.date AS `Date 1`, b.date AS `Date 2`
FROM a
RIGHT JOIN b ON b.row = a.row
需要比Date 1 Date 2
2019-01 2018-10
2019-02 2018-11
2019-03
2019-04
日期更多的FULL JOIN
日期)。