person_add表是加入会员表,有字段adddate(如:2012-10-01)
person_quit表是退出会员表,有字段quitdate(如:2012-12-01) 如何作出如下的格式(共12行,每月一行,加入或退出人数为空时显示0):月份  加入人数  退出人数
1月     3         0
2月     0         0
......
12月    5         2 下面的sql语句可以统计出person_add表的月份和加入人数,如下:
select DATE_FORMAT(adddate,'%Y-%m') as month,count(*) as add from person_add where DATE_FORMAT(adddate,'%Y')= year(curdate()) group by month order by month; 但是上面的sql存在两个问题:
1、没有把退出会员表的数据合并过来。
2、当加入人数的月份为空时,比如2月无人加入,则2月这一行不显示。 请教如何实现上面的格式? mysqldatesql

解决方案 »

  1.   

    1.二表要联合
    2.用此函数ifnull(adddate,0);select DATE_FORMAT(A.adddate,'%Y-%m') as month,count(*) as add from person_add A where DATE_FORMAT(A.adddate,'%Y')= year(curdate()) left join person_quit Q ON A.id=Q.id group by month order by month; 
      

  2.   

    select DATE_FORMAT(adddate,'%Y-%m') as month,
    sum(a) as 加入人数,
    sum(q) as 退出人数
    from (
    select adddate,1 as a,0 as q from person_add
    union all
    select quitdate,1 as a,1 as q from person_add
    ) t
    group by DATE_FORMAT(adddate,'%Y-%m');
      

  3.   

    Quote: 引用 1 楼 bonlog 的回复:

    1.二表要联合
    2.用此函数ifnull(adddate,0);sql执行报错:
    You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'add from person_add A where DATE_FORMAT(A.adddate,'%Y')= year(curdate()) left j' at line 1
      

  4.   

    Quote: 引用 2 楼 ACMAIN_CHM 的回复:

    执行sql后,显示的逻辑有错误,显示结果如下:
    month     加入人数    退出人数
    2012-09     1          1
    2012-10     2          0
    2012-11     5          0
    2012-12     9          1数据库中,9月份有1个退出人数,但是没有新加的人数的。请问该怎么完善该SQL?
      

  5.   

    select DATE_FORMAT(adddate,'%Y-%m') as month,
        sum(a) as 加入人数,
        sum(q) as 退出人数
    from (
        select adddate,1 as a,0 as q from person_add
        union all
        select quitdate,0 as a,1 as q from person_add
    ) t
    group by DATE_FORMAT(adddate,'%Y-%m');
      

  6.   

    问题基本解决。谢谢了!还有一点,能不能十二个月份都显示全了,即没有的显示为0,如下:
    month     加入人数    退出人数
    2012-01     0          0
    2012-02     0          0
    ........................
    2012-09     0          1
    2012-10     2          0
    2012-11     5          0
    2012-12     8          1