我正在创建一个员工跟踪应用。
我有一个 MySQL 表,如下所示:
我想创建一个 View ,返回首先按 PersonID 排序然后按 ID 排序的记录,但将行转换为列。
像这样:
有人知道如何在 MySQL 中执行此操作吗?
感谢您的任何建议。
最佳答案
使用窗口函数 LEAD()
或 LAG()
为每一行获取其对行,具体取决于其 TypeID
并执行结果与表的左连接:
WITH cte AS (
SELECT *,
CASE
WHEN TypeID = 'IN' AND LEAD(TypeID) OVER w = 'OUT' THEN LEAD(ID) OVER w
WHEN TypeID = 'OUT' AND LAG(TypeID) OVER w = 'IN' THEN LAG(ID) OVER w
END other_ID
FROM tablename
WINDOW w AS (PARTITION BY PersonID ORDER BY DateTime)
)
SELECT DISTINCT c.PersonID,
CASE WHEN c.TypeID = 'IN' THEN c.ID ELSE t.ID END InID,
CASE WHEN c.TypeID = 'IN' THEN c.DateTime ELSE t.DateTime END In_DateTime,
CASE WHEN c.TypeID = 'IN' THEN t.ID ELSE c.ID END OutID,
CASE WHEN c.TypeID = 'IN' THEN t.DateTime ELSE c.DateTime END Out_DateTime
FROM cte c LEFT JOIN tablename t
ON t.ID = c.other_ID
ORDER BY c.PersonID, COALESCE(In_DateTime, Out_DateTime);
参见 demo .
关于mysql - 如何创建将行转换为列的 MySQL 查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73652231/