我曾考慮過使用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')
我認爲CASE語句是要走的路。 – zimdanen 2013-04-23 20:25:13
我會使用公共表格表達式(CTE)請參閱http://msdn.microsoft.com/en-us/library/ms175972.aspx – 3dd 2013-04-23 20:30:08
@ 3dd我編輯了我的CASE版本的原始帖子。你知道你如何將它轉換成CTE嗎?這條語句的結果將需要插入到表中。 – 2013-04-23 20:34:48