我希望采用下表,并以下面列出的格式表示数据。
所有的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 |
-------------------------发布于 2019-01-24 07:07:43
尝试这样做,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发布于 2019-01-24 07:12:13
在MySQL 8+中,您可以使用ROW_NUMBER()对行进行排序,然后将B日期连接到相应的A日期。请注意,如果您的B日期可能比A日期多,则需要一个在MySQL中不可用的FULL JOIN,但它可以由LEFT JOIN和RIGHT JOIN的UNION模拟。如果不是这样,您可以从UNION开始删除查询的一部分。
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 Demo on dbfiddle (这也说明了对B日期多于A日期的FULL JOIN的需求)。
https://stackoverflow.com/questions/54336922
复制相似问题