SQL CASE和JOINS:如何获得不同的计数和总数?

时间:2013-03-13 15:45:52

标签: sql count sum case

我需要一些帮助。我想知道我的系统中这些列的激活,停用和用户总数。当前输出包括NAME列中的名称两次输出,如下所示,包括NULLS。我想消除NULL并获得每列的子总数。希望我能得到一些帮助。

  Current output:
- NAME   Activated  Deactivated 
- MAX     25          NULL
- MAX     NULL         5
- TAX     40          NULL
- TAX     NULL         10

    Desired output:
  - NAME   Activated  Deactivated 
   - MAX     25          5  
  - TAX     40          10
   -Total    65          15

感谢。

select 
    case 
        when (upper(m.email) like '%max.com') then 'MAX'
        when (upper(m.email) like '%tax.com') then 'TAX'
        else 'OTHER'
        end Name, count(*) 'Activated', null 'Deactivated'
from 
    membership.user_details d
    inner join membership.aspnet_membership m 
        on m.userid = d.userid
    inner join membership.user_notes n 
        on n.userid = d.userid
        and n.created_on = (
            select 
                min(created_on) 
            from 
                membership.user_notes 
            where 
                userid = n.userid
                and note = 'received.'
        )
        and substring(convert(varchar(8),n.created_on,112),1,6) = '201209'
where 
    approved = 1
group by       
    case 
        when (upper(m.email) like '%max.com') then 'MAX'
        when (upper(m.email) like '%tax.com') then 'TAX'
        else 'OTHER'
        end      

union 

select 
    case 
        when (upper(m.email) like '%max.com') then 'MAX'
        when (upper(m.email) like '%tax.com') then 'TAX'
        else 'OTHER'
        end Name,  
    null 'Activated', 
    count(*) 'Deactivated'
from 
    membership.user_details d
    inner join membership.aspnet_membership m 
        on m.userid = d.userid
    inner join membership.user_notes n 
        on n.userid = d.userid
        and n.CREATED_ON = (
            select 
                min(created_on) 
            from 
                membership.user_notes 
            where 
                userid = n.userid
                and note = 'SAAR received.'
        )
        and substring(convert(varchar(8),m.LastLockoutDate,112),1,6) = '201209'
where 
    approved = 1
group by       
    case 
        when (upper(m.email) like '%max.com') then 'MAX'
        when (upper(m.email) like '%tax.com') then 'TAX'
        else 'OTHER'
        end       

2 个答案:

答案 0 :(得分:0)

分别将null 'Deactivated'null 'Activated'更改为0'Deactivated'0'Activated',然后执行GROUP BY Name WITH ROLLUP

答案 1 :(得分:0)

您应该能够将其合并为一个SELECT

select 
    case 
        when (upper(m.email) like '%max.com') then 'MAX'
        when (upper(m.email) like '%tax.com') then 'TAX'
        else 'OTHER'
    end Name, 
    SUM(case when substring(convert(varchar(8),n.created_on,112),1,6) = '201209' then 1 else 0 end) 'Activated',
    SUM(case when substring(convert(varchar(8),m.LastLockoutDate,112),1,6) = '201209' then 1 else 0 end) 'Deactivated'
from membership.user_details d
inner join membership.aspnet_membership m 
    on m.userid = d.userid
inner join membership.user_notes n 
    on n.userid = d.userid
    and n.CREATED_ON = (select min(created_on) 
                        from membership.user_notes 
                        where userid = n.userid
                            and note = 'SAAR received.')  
where approved = 1
group by case when (upper(m.email) like '%max.com') then 'MAX'
          when (upper(m.email) like '%tax.com') then 'TAX'
          else 'OTHER' end     

此新版本使用带有CASE表达式的聚合函数来获取总ActivatedDeactivatedCASE 检查每个查询使用的日期。

然后,如果要包含总行,可以使用GROUP BY with ROLLUP