2012-07-16 111 views
0

为什么这个查询没有返回2011年和2012年的数据。任何人都可以帮助我。提前感谢。Sql查询不起作用?

SELECT 
    country_code, 
    SUM(`attendance`) as k6_attendance, 
    count(*) as total_events , 
    IF(MONTH(`session_date`)<5,YEAR(`session_date`),YEAR(`session_date`)+1) as YR2 
    FROM `v_knowledge_session` v 
    WHERE session_date >0 
    Group by YR2,country_code 
    HAVING YR2>(YEAR(NOW())-2) AND country_code='IN' 
    ORDER BY country_code,YR2; 
+0

帖子来自表格的'session_date'和'country_code'的一些记录。 – 2012-07-16 06:07:51

+0

也提供您的表格结构.. 意味着您的表格的描述.. – 2012-07-16 06:08:33

+0

您确定您在过去的2.5年内有country_code ='IN'*和* session_date的数据吗?你可以发表一个表格描述('DESCRIBE v_knowledge_session;'和一些示例数据和期望的输出吗? – 2012-07-16 06:13:55

回答

0

您需要使用ORDER比其他地方一样的表情BY子句

SELECT country_code,SUM(`attendance`) as k6_attendance,count(*) as total_events , 
    IF(MONTH(`session_date`)<5,YEAR(`session_date`),YEAR(`session_date`)+1) as YR2 
    FROM `v_knowledge_session` v 
    WHERE session_date >0 
    Group by IF(MONTH(`session_date`)<5,YEAR(`session_date`),YEAR(`session_date`)+1) ,country_code 
    HAVING IF(MONTH(`session_date`)<5,YEAR(`session_date`),YEAR(`session_date`)+1) >(YEAR(NOW())-2) AND country_code='IN' 
    ORDER BY country_code,YR2; 
+1

在'having'中使用列或表达式* aliases *是可以接受的。请参考[* here *](http://www.mysqltutorial.org/mysql-having.aspx)。 – 2012-07-16 06:12:47

+0

它不工作。 – 2012-07-16 06:24:56

0

不能在HAVING子句中使用非聚集状态。 country_code='IN'必须在WHERE条款中。 HAVING子句创建的原因是因为WHERE子句无法处理聚合条件。在您的查询中,having子句不需要,因为您的条件未汇总。您还可以删除ALIASv

试试这个:

SELECT country_code, 
      SUM(`attendance`) as k6_attendance, 
      count(*) as total_events , 
      IF(MONTH(`session_date`) < 5 , 
       YEAR(`session_date`), 
       YEAR(`session_date`) + 1) as YR2 
FROM  `v_knowledge_session` 
WHERE  session_date > 0 AND country_code='IN' AND YR2 > (YEAR(NOW())-2) 
Group by YR2, country_code 
ORDER BY country_code,YR2; 
+0

不可以。在'having'中使用列或表达式* aliases *是可以接受的,但不能在'where'子句。请参阅[* here *](http://www.mysqltutorial.org/mysql-having.aspx),[* here *](http://stackoverflow.com/questions/200200/can-you -use-an-alias-in-the-where-clause-in-mysql)和[*列别名问题*](http://dev.mysql.com/doc/refman/5.0/en/problems- with-alias.html)。 – 2012-07-16 06:16:35

1

尝试在外部查询包裹它在一个子查询,然后使上YR2比较算账:

SELECT a.* 
FROM 
(
    SELECT 
     country_code, 
     SUM(attendance) AS k6_attendance, 
     COUNT(*) AS total_events, 
     IF(MONTH(session_date)<5,YEAR(session_date),YEAR(session_date)+1) AS YR2 
    FROM v_knowledge_session v 
    WHERE session_date > 0 AND country_code = 'IN' 
    GROUP BY YR2, country_code 
) a 
WHERE 
    a.YR2 > YEAR(NOW())-2 
ORDER BY 
    a.country_code, a.YR2