[英]LEFT JOIN with right table criteria
SELECT a.ID as id,
GROUP_CONCAT(CASE
WHEN b.Code = 'In'
THEN b.Time
end) as `Time In`,
`TIME START`,
GROUP_CONCAT(CASE
WHEN b.Code = 'Out'
THEN b.Time
end) as `Time Out`
FROM `Table A` a
JOIN `Table B` b on a.ID = b.ID
WHERE 1
AND ((b.Code = 'In' && b.`TIME` <= a.`TIME START`) OR
(b.Code = 'Out' && b.`TIME` >= a.`TIME START`))
GROUP BY a.ID, a.`Time Start`
查詢不處理 Code='In/Out' 您需要拆分此顯式
您可以使用幾個LEFT JOINs
來做到這一點:
SELECT
ts.ID,
MAX(ti.Time) AS Time,
MAX(ts.TimeStart) AS TimeStart,
MAX(tto.Time) AS TimeOut
FROM tableA ts
LEFT JOIN tableB ti ON ts.ID = ti.ID AND ti.Code IN ('IN','IN/OUT') -- "Time IN"
LEFT JOIN tableB tto ON ts.ID = tto.ID AND tto.Code IN ('Out','IN/OUT') -- "Time OUT"
GROUP BY ts.ID
ORDER BY ts.ID
就像 Impaler 提到的那樣,您對IN/OUT
的描述和您提供的所需結果似乎並不同步。 上面的示例假設IN/OUT
既是IN
又是OUT
。 如果有重復條目,這還將為您提供最大TimeIn/TimeOut
值。
嘗試在連接之前聚合表 B:
WITH cte AS
( -- pivot into in/out time
SELECT
ID
,Max(CASE WHEN Code IN ('IN', 'IN/OUT') THEN Time END) AS TimeIn
,Max(CASE WHEN Code IN ('Out','IN/OUT') THEN Time END) AS TimeOut
FROM tableB
GROUP BY ID
)
SELECT
a.ID
,CASE WHEN TimeStart >= TimeIn THEN TimeIn END AS TimeIn
,TimeStart
,CASE WHEN TimeStart <= TimeOut THEN TimeIn END AS TimeIn
FROM tableA AS a
LEFT JOIN cte AS b
ON a.ID = b.ID
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.