mysql - SQL - 对重复行进行分组和计数
问题描述
我不知道如何在 mysql 上对重复行进行分组和计数
以下是我从查询中得到的结果
ssn + checktime + nama
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
'196702031989031001' + '2018-08-03 07:33:02' + 'FAJAR PERMADI'
'196810021993031001' + '2018-08-01 07:33:25' + 'ANDRI ANGGORO, SH'
'196911052000031001' + '2018-08-03 07:47:22' + 'SEMI TEDDY RORY, SS'
'196912221994032001' + '2018-08-01 08:03:59' + 'AI SALATUN'
'196912221994032001' + '2018-08-02 09:34:11' + 'AI SALATUN'
'196912221994032001' + '2018-08-03 07:33:18' + 'AI SALATUN'
'197012051993031001' + '2018-08-01 07:58:47' + 'AHMAD SODIKIN, SH'
'197012192001121001' + '2018-08-01 09:54:21' + 'JUARA PAHALA MARBUN, ST'
'197012192001121001' + '2018-08-02 09:39:41' + 'JUARA PAHALA MARBUN, ST'
以下是我的查询
SELECT a.ssn, a.checktime, b.nama
FROM hki_kepegawaian.fo_absensi a
left join hki_kepegawaian.fo_pegawai b on a.ssn = b.nip
where (substring(cast(checktime as DATE), 6, 2) = '08')
and (cast(a.checktime as TIME)) >= '07:30:00' and (cast(a.checktime as
TIME)) <= '10:00:00'
and (substring(golongan, 1, 2)) NOT IN ('IV')
group by ssn, cast(a.checktime as date)
以下是我预期的结果
ssn + checktime + nama + total
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
'196702031989031001' + '2018-08-03 07:33:02' + 'FAJAR PERMADI' + 1
'196810021993031001' + '2018-08-01 07:33:25' + 'ANDRI ANGGORO, SH' + 1
'196911052000031001' + '2018-08-03 07:47:22' + 'SEMI TEDDY RORY, SS' + 1
'196912221994032001' + '2018-08-01 08:03:59' + 'AI SALATUN' + 3
'197012051993031001' + '2018-08-01 07:58:47' + 'AHMAD SODIKIN, SH' + 1
'197012192001121001' + '2018-08-01 09:54:21' + 'JUARA PAHALA MARBUN, ST' + 2
解决方案
我同意蒂姆的观点,你似乎想最早的时间。group by
在这种情况下,这是通过 a 完成的。
但是,我建议对查询进行一些其他修复:
- 不要对日期/时间使用字符串操作。
- 使用有意义的表别名,即表的缩写。
- 将所有未聚合的列包含在
GROUP BY
. - 在适当的地方使用
LIKE
。
所以,我建议:
SELECT a.ssn, a.checktime, p.nama
FROM hki_kepegawaian.fo_absensi a LEFT JOIN
hki_kepegawaian.fo_pegawai b
ON a.ssn = p.nip
WHERE MONTH(checktime) = 8 AND
CAST(a.checktime as TIME) >= '07:30:00' AND
CAST(a.checktime as TIME)) <= '10:00:00' AND
golongan NOT LIKE 'IV%'
GROUP BY a.ssn, p.nama;
推荐阅读
- vue.js - 为什么使用 github 操作和 azure cli 部署我的静态站点被破坏?
- angular - 使用 Angular 10 的 .Net core 3.1 应用程序在开发环境中工作,但是当我在生产环境中部署时显示 net::ERR_CONNECTION_REFUSED
- javascript - 如何将 Vuex 存储注入 Vue 3
- c++ - 在 C++ 中删除树结构
- c - C - 新变量中的 fgets 元素
- javascript - 如何在 Safari 而不是应用内浏览器中打开链接
- javascript - 如何使用 mongoose 添加到此模式数组?
- javascript - 在 if 语句中使用 style.display 暂停 javascript 游戏不起作用
- c++ - 在某个字符串值处将字符串添加到文本文件中
- r - 坚持在 R 中创建一个虚拟变量