我有一个包含多个列的数据库,我已经创建了这个视图,其中有多行,类似于下面显示的行。该数据适用于2009年至2010年的每个月中的每一天以及所给出的5个名称的所有月份。我必须得到'姓名'出现类别'超级'每个月超过5次并且每个月单独列出。该视图包含所有月份的数据。
Name Dates Category
--------------------------------
PAT 2009-01-01 Super
YAT 2009-01-01 No
ROT 2009-01-01 No
SUP 2009-01-01 Super
ANT 2009-01-01 Super
我尝试使用
计算MySQL中的NameSELECT `NAME`,`DATES`
FROM (
SELECT `NAME`, `CATEGORY`,MONTH(`DATES`)
FROM VIEW
GROUP BY `NAME`, `CATEGORY`,MONTH(`DATES`)
HAVING COUNT(`CATEGORY`)>5
) a
GROUP BY `NAME`
HAVING count(`CATEGORY`)>5;
但它不会返回任何行。
答案 0 :(得分:0)
您尝试将行分组为几个月。执行此操作的最佳方法是从一个表达式开始,该表达式将占用任何日期并将其转换为发生它的月份的第一天。那个表达是。
DATE(DATE_FORMAT(dates, '%Y-%m-01'))
接下来,在具有GROUP BY子句的查询中使用此表达式。
SELECT NAME, CATEGORY,
DATE(DATE_FORMAT(DATES, '%Y-%m-01')) DATES
FROM VIEW
GROUP BY NAME, CATEGORY, DATE(DATE_FORMAT(DATES, '%Y-%m-01'))
HAVING COUNT(*) > 5
这将产生超过五次的所有名称/类别/月份组合。
我认为这就是你想要的。但也许你想要所有任何月份中列出的月度项目,其中超级类别对于某些名称出现超过五次。为此,我们首先编写一个子查询来获取这些日期的列表:
SELECT DATE(DATE_FORMAT(DATES, '%Y-%m-01')) DATES
FROM VIEW
WHERE CATEGORY = 'Super'
GROUP BY NAME, DATE(DATE_FORMAT(DATES, '%Y-%m-01'))
HAVING COUNT(*) > 5
然后我们编写一个主查询来获取所有数据
SELECT DISTINCT
NAME, CATEGORY,
DATE(DATE_FORMAT(DATES, '%Y-%m-01')) DATES
FROM VIEW
WHERE DATE(DATE_FORMAT(DATES, '%Y-%m-01')) IN
(
SELECT DATE(DATE_FORMAT(DATES, '%Y-%m-01')) DATES
FROM VIEW
WHERE CATEGORY = 'Super'
GROUP BY NAME, DATE(DATE_FORMAT(DATES, '%Y-%m-01'))
HAVING COUNT(*) > 5
)
让这类事情发挥作用的诀窍是选择正确的日期算术表达式,以便在GROUP BY
子句中使用。 DAY()
,MONTH()
和YEAR()
等功能难以正确使用,因此我认为您可能会发现DATE(DATE_FORMAT(dates, '%Y-%m-01'))
更可靠。