我正在尝试使用子查询和IF NULL将包含行IN和OUT的出勤对合并到一行中
我有一个用户710的应用程序表,它用于用户的进入时间和退出时间
id userid mode date_entry time_entry
1 710 In 2022-03-23 2022-03-23 07:05:58
2 710 Out 2022-03-24 2022-03-24 07:03:25
3 710 In 2022-03-24 2022-03-24 07:00:05
4 710 Out 2022-03-24 2022-03-24 18:06:23
5 710 In 2022-03-25 2022-03-25 07:10:16
6 710 In 2022-03-26 2022-03-26 07:11:57
7 710 Out 2022-03-26 2022-03-26 18:18:12
并使用此查询:
SELECT a.`id`,a.`userid`,a.`date_entry`,
(SELECT MIN(b.`time_entry`) FROM erpweb.`app` b WHERE b.`date_entry` = a.`date_entry` AND b.`mode` = 'IN' AND b.`userid` = a.`userid`) AS 'IN',
IFNULL(
(SELECT b.`time_entry` FROM erpweb.`app` b WHERE b.`date_entry` = a.`date_entry` AND b.`mode` = 'OUT' AND b.`userid` = a.`userid` LIMIT 1),
(SELECT MIN(b.`time_entry`) FROM erpweb.`app` b WHERE b.`date_entry` = DATE_ADD(a.`date_entry`,INTERVAL 1 DAY) AND b.`mode` = 'OUT' AND b.`userid` = a.`userid`)
)AS 'OUT'
FROM erpweb.`app` a
WHERE a.`date_entry` BETWEEN '2022-03-23'
AND '2022-03-26'
GROUP BY a.`date_entry`,a.`userid`
我得到了这个结果。您可以在行ID 5中看到,它采用了2022-03-26的OUT,这与我的SQL查询第4行中的where子句“WHERE b. date_entry
= a. date_entry
”不匹配,因为我没有2022-03-25的OUT
id userid date_entry IN OUT
1 710 2022-03-23 2022-03-23 07:05:58 2022-03-24 07:03:25
2 710 2022-03-24 2022-03-24 07:00:05 2022-03-24 07:03:25
5 710 2022-03-25 2022-03-25 07:10:16 2022-03-26 18:18:12
6 710 2022-03-26 2022-03-26 07:11:57 2022-03-26 18:18:12
预期结果必须为:NULL在行ID 5中,因为用户ID 710没有时间OUT用于日期2022-03-25
id userid date_entry IN OUT
1 710 2022-03-23 2022-03-23 07:05:58 2022-03-24 07:03:25
2 710 2022-03-24 2022-03-24 07:00:05 2022-03-24 07:03:25
5 710 2022-03-25 2022-03-25 07:10:16 NULL
6 710 2022-03-26 2022-03-26 07:11:57 2022-03-26 18:18:12
1条答案
按热度按时间w1e3prcc1#
即选择行对,其中前一行是IN,后一行是OUT,并且在它们之间没有任何行。如果确定的IN行没有这样的OUT行,则添加NULL行。
如果需要,按
userid
添加条件。