选择对于特定列具有类似值的行,每个月出现n次

时间:2015-02-06 20:02:30

标签: mysql date select conditional

我有一个包含多个列的数据库,我已经创建了这个视图,其中有多行,类似于下面显示的行。该数据适用于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中的Name
SELECT `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;

但它不会返回任何行。

1 个答案:

答案 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'))更可靠。