1

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')
4

1 に答える 1

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)
于 2013-04-23T20:47:12.050 に答える