我有一张看起来像这样的桌子;
ID | netID | indate | outdate | name | org
=====================================================================
1 | 50 | 2020-03-31 23:50 | 2020-03-31 23:32 | Bill | orgA
2 | 50 | 2020-03-31 23:51 | 2020-03-31 23:32 | Fred | orgA
3 | 50 | 2020-04-01 00:02 | 2020-04-01 00:05 | Sam | orgA
4 | 51 | 2020-03-31 23:50 | 2020-03-31 23:32 | Harry | orgB
5 | 51 | 2020-03-31 23:51 | 2020-03-31 23:32 | George | orgB
6 | 51 | 2020-04-01 00:02 | 2020-04-01 00:05 | Tom | orgB
我需要按组织,年份和月份编写报告,但是必须包含具有相同netID的任何行,即使该行在不同的年份或月份中也是如此。而且我不能说“ WHERE netID = 50”,因为我不知道“ 2020”年的“ 03”月中的netID是什么。
如果我需要2020年3月的orgA报告,我正在寻找要返回的前三行。
以下内容无法满足我的需要,而且我无法弄清楚如何获得每个netID的所有行,而与月份无关。有人可以给我一个如何找回它们的例子吗?
SELECT date(iodate) as logdate,
Name,
netID,
COALESCE( netID, 'Month Total') AS netTTL,
COUNT(ID) AS idCount,
month(logdate AS month
FROM table
WHERE org = 'orgA'
AND year(indate) = '2020'
AND month(iodate) = '03'
GROUP BY year(logdate), month, netID WITH ROLLUP
一种获取存在任何行的所有行的方法,该行具有相同的净ID,所请求的组织和所请求范围内的日期,这是在派生表中获取该范围和组织的净ID,然后将其联接到表中。
SELECT t1.*
FROM (SELECT DISTINCT
t2.netid
FROM elbat t2
WHERE t2.org = 'orgA'
AND t2.indate >= '2020-03-01'
AND t2.indate < '2020-04-01') x
INNER JOIN elbat t1
ON t1.netid = x.netid;
一些注意事项:
year()
子句中的日期应用month()
和WHERE
。范围表达式可以使用索引并加快查询的速度。GROUP BY
的列/表达式。尽管较旧的或配置错误的MySQL服务器可以接受,但可能会产生有趣的结果。但是,由于您没有进一步说明要在此处做的事情,因此这里只说了“您做错了!”。