这可以清理或浓缩吗?

时间:2013-04-23 20:13:40

标签: sql tsql

我考虑使用CASE语句来清理一些,现在它在大约10秒内运行。希望压缩下来以及冗余代码调用。想知道是否有比CASE更好的方式。

有3个独立的代码块。除了根据队列中的天数分配颜色外,每个块几乎完全相同。

绿色不到1天。 黄色任何大于1天但少于3天的东西。 红色超过3天。

select m.number, 'status1', 'Green', datediff(day, (select max(datechanged) from statushistory where accountid = m.number), getdate())
from master m with (nolock)
inner join customer c with (nolock) on m.customer = c.customer
where m.status = 'status1'
and datediff(day, (select max(sh.datechanged) from statushistory sh where accountid = m.number), getdate()) <= 1
and qlevel < 998
and (m.desk not like 'ATY%')
and (isnull(m.link,0) = 0 or m.linkdriver = 1)
and m.desk not in ('param1','param2','param3','param4','param5','param6','param7','param8','param9','param10','param11','param12')

select m.number, 'status1', 'Yellow', datediff(day, (select max(datechanged) from statushistory where accountid = m.number), getdate())
from master m with (nolock)
inner join customer c with (nolock) on m.customer = c.customer
where m.status = 'status1'
and datediff(day, (select max(sh.datechanged) from statushistory sh where accountid = m.number), getdate()) between 1 and 2
and qlevel < 998
and (m.desk not like 'ATY%')
and (isnull(m.link,0) = 0 or m.linkdriver = 1)
and m.desk not in ('param1','param2','param3','param4','param5','param6','param7','param8','param9','param10','param11','param12')

select m.number, 'status1', 'Red', datediff(day, (select max(datechanged) from statushistory where accountid = m.number), getdate())
from master m with (nolock)
inner join customer c with (nolock) on m.customer = c.customer
where m.status = 'status1'
and datediff(day, (select max(sh.datechanged) from statushistory sh where accountid = m.number), getdate()) >= 3
and qlevel < 998
and (m.desk not like 'ATY%')
and (isnull(m.link,0) = 0 or m.linkdriver = 1)
and m.desk not in ('param1','param2','param3','param4','param5','param6','param7','param8','param9','param10','param11','param12')

编辑#1

select m.number, 'status1', 
CASE 
    WHEN datediff(day, (select max(sh.datechanged) from statushistory sh where accountid = m.number), getdate()) <= 1 THEN 'Green'
    WHEN datediff(day, (select max(sh.datechanged) from statushistory sh where accountid = m.number), getdate()) between 1 and 3 THEN 'Yellow'
    WHEN datediff(day, (select max(sh.datechanged) from statushistory sh where accountid = m.number), getdate()) > 3 THEN 'Red'
END
, datediff(day, (select max(datechanged) from statushistory where accountid = m.number), getdate())
from master m with (nolock)
inner join customer c with (nolock) on m.customer = c.customer
where m.status = 'status1'
--and datediff(day, (select max(sh.datechanged) from statushistory sh where accountid = m.number), getdate()) <= 1
and qlevel < 998
and (m.desk not like 'ATY%')
and (isnull(m.link,0) = 0 or m.linkdriver = 1)
and m.desk not in ('param','param','param','param','param','param','param','param','param','param','param','param')

1 个答案:

答案 0 :(得分:1)

with cte as (
    select 
        m.number, 
        m.status, 
        days = datediff(day, (select max(datechanged) from statushistory where accountid = m.number), getdate())
    from 
        master m with (nolock)
        inner join customer c with (nolock) on m.customer = c.customer
    where 
        m.status = 'status1'
        and d between 1 and 2
        and qlevel < 998
        and (m.desk not like 'ATY%')
        and (isnull(m.link,0) = 0 or m.linkdriver = 1)
        and m.desk not in ('param1','param2','param3','param4','param5','param6','param7','param8','param9','param10','param11','param12')

), colorThresholds as (
    select color = 'Green', minDays = null, maxDays = 1 union
    select 'Yellow', 2, 3 union
    select 'Red', 4, null
)

/* now apply the color thresholds */
select
    c.*,
    ct.color
from
    cte c
    /* outer join in case the thresholds don't cover all ranges */
    left outer join colorThresholds ct on
        (ct.minDays is null or c.days >= ct.minDays)
        and (ct.maxDays is null or c.days <= ct.maxDays)