2013-03-13 83 views
0

我需要一些帮助。我希望对我的系统中用于这些列的用户进行计数,并对其进行激活,停用和计数。当前输出包含NAME列中两次输出的名称,如下所示,其中包含NULLS。我想消除NULL,并获得每列的小计。希望我能得到一些帮助。SQL CASE和JOINS:如何获得不同的计数和总计?

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  
+0

哪些表结构? – Melanie 2013-03-13 15:53:08

+0

这个sql脚本从各种表中获取信息。确切地说3张桌子。桌上用于获取案件的电子邮件,下一个用于查看用户是否曾经被批准过,而另一个用于用户第一次进入系统(已授权)。 – user1880670 2013-03-13 15:57:49

回答

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

+0

这样做。我要用ROLLUP在Group BY上做一些作业,因为我还想添加一个总ROM。我以前从未使用过该功能。感谢您的帮助! – user1880670 2013-03-13 16:40:16

+0

@ user1880670乐于帮忙! :)如果您对“通过汇总”进行分组时遇到任何问题,请发布新问题。 – Taryn 2013-03-13 16:40:53

0

变化null 'Deactivated'分别null 'Activated'0'Deactivated'0'Activated',然后做一个GROUP BY Name WITH ROLLUP