2013-03-13 190 views
1

我似乎遇到了我的SQL的最後一塊麻煩。 當在我的SQL NULL中出現使用滾動功能實現組時。如何修改NULL以便在此聚合SQL中用TOTAL替換它?Rollup函數 - 替換NULL

Current table returned 
Name Activate Deactivate 
Max  5  2 
TAX  12  5 
NULL 17  8 

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 = '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  
    with RollUp 

回答

8

ROLLUP地方總計行中的null所以如果要更換,我會建議採取現有查詢,並把它放在一個子查詢,然後使用CASENAME更換nullTotal

您的代碼將類似於此:

select 
    case when name is null then 'Total' else name end Name, 
    sum(Activated) Activated, 
    sum(Deactivated) Deactivated 
from 
(
    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 = '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  
) src 
group by name with rollup 

如果你不裹在一個子查詢的查詢,那麼你可以使用這樣的事情:

select 
    case when 
    (case 
     when (upper(email) like '%max.com') then 'MAX' 
     when (upper(email) like '%tax.com') then 'TAX' 
     else 'OTHER' 
     end) is null then 'Total' 
     else case 
     when (upper(email) like '%max.com') then 'MAX' 
     when (upper(email) like '%tax.com') then 'TAX' 
     else 'OTHER' 
     end 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 = '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 with rollup 
+0

我真的在未來的時候,像上面那樣爲Total做了案例...花了一段時間讓我在昨天晚上想到它。感謝您的幫助bluefeet!先生,好日子! – user1880670 2013-03-14 13:57:48

+0

唯一的技巧是'當名稱爲空的情況下'總'其他名稱結束名稱' – guneysus 2015-02-14 00:46:00

+0

@guneysus我不完全確定你爲什麼投票正確的答案。我的回答包括你說的「詭計」。 – Taryn 2015-02-14 01:44:30

4

使用此代替直名稱參考:

case when grouping(Name) then 'Total' else Name end as Name

如果只使用分組的一個水平,空測試就足夠;不過,分組(...)測試允許爲每個不同的分組級別生成不同的描述。

+0

當這樣做系統retuns說, NAME不是一個有效的柱子,它不是。它只是一個臨時列。 – user1880670 2013-03-13 22:52:36

+0

明白了。作爲第一種情況,將建議的邏輯添加到您現有的計算中。 – 2013-03-13 22:55:19

+0

第一個SUM以上的權利? – user1880670 2013-03-13 22:57:02

0

你可以用你的case聲明與isnull函數:

select 
    isnull 
     (
     case 
      when (upper(m.email) like '%max.com') then 'MAX' 
      when (upper(m.email) like '%tax.com') then 'TAX' 
      else 'OTHER' 
     end, 
     'Total' 
     ) 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 = '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  
with rollup