我對這個問題很感興趣,而且我發現討論複雜查詢的最好方法是用我自己的樣式和約定重新格式化它。我將它們應用於您的解決方案,結果如下。我不知道這是否會要你的任何值...
- 有代碼,我不相信是MS的T-SQL語法的一部分幾個位,如
({fn xxx }
和WEEK(xxx)
功能。
- 此代碼編譯,但我不能運行它,因爲我沒有正確配置數據表。
- 我做了大量的編碼修改,需要大量的解釋,我會跳過其中的大部分。如果你想要解釋任何事情,請添加評論。
- 我扔了很多空白。可讀和不可讀代碼之間的區別往往只是旁觀者的看法和敏感性,你可能會討厭我的約定。
- 不知道最終的結果集應該是什麼(即,得到返回的列)
一些進一步的說明:
- 這個查詢將不會在一個星期內,如果沒有項目也進入項目在當週關閉
- 周可能是部分的,例如並非所有七天都可能存在(調整@間隔始終包括整週 - 但奇數間隔又如何?)
- 將count(*)值乘以1.0以將它們轉換爲提前浮動(避免使用轉換和整數數學截斷)
- 使它成爲CTE允許上述公式中,以在後來的公式符號來代替(在這點事情成了很多更清晰)
所以這裏就是我想出了:
;WITH cte as (
select
c.period
,resolved_half1
,resolved_half2
,opened_half1
,opened_half2
,row = row_number() over(order by c.yearClosed, c.weekClosed)
,y1 = ((SUM(resolved_half1) + SUM(opened_half1)) - (SUM(resolved_half2) + SUM(opened_half2)))/((count(resolved_half1) + count(opened_half1))/2)
,y2 = ((SUM(resolved_half2) + SUM(opened_half2))/(count(resolved_half2) + COUNT (opened_half2)))
,x1 = ((count(c.period))/4)
,x2 = (((count(c.period))/4) * 3)
from (select
a.yearclosed
,a.weekClosed
,a.resolved_half1
,b.yearEntered
,b.weekEntered
,b.opened_half1
,cast(a.yearClosed as varchar(5)) + ', ' + cast(a.weekClosed as varchar(5)) period
from (-- Number of items per week that closed within @Interval
select
count(distinct TicketNbr) * 1.0 resolved_half1
,datepart(wk, date_closed) weekClosed
,year(date_closed) yearClosed
from v_rpt_Service
where date_closed >= @FullInterval
group by
datepart(wk, date_closed)
,year(date_closed)) a
left outer join (-- Number of items per week that were entered within @Interval
select
count(distinct TicketNbr) * 1.0 opened_half1
,datepart(wk, date_entered) weekEntered
,year(date_entered) yearEntered
from v_rpt_Service
where date_entered >= @FullInterval
group by
datepart(wk, date_entered)
,year(date_entered)) b
on a.weekClosed = b.weekEntered
and a.yearClosed = b.yearEntered) c
left outer join (select
d.yearclosed
,d.weekClosed
,d.resolved_half2
,e.yearEntered
,e.weekEntered
,e.opened_half2
,cast(yearClosed as varchar(5)) + ', ' + cast(weekClosed as varchar(5)) period
from (select
count(distinct TicketNbr) * 1.0 resolved_half2
,datepart(wk, date_closed) weekClosed
,year(date_closed) yearClosed
from v_rpt_Service
where date_closed >= @HalfInterval
group by
datepart(wk, date_closed)
,year(date_closed)) d
left outer join (select
count(distinct TicketNbr) * 1.0 opened_half2
,datepart(wk, date_entered) weekEntered
,year(date_entered) yearEntered
from v_rpt_Service
where date_entered >= @HalfInterval
group by
datepart(wk, date_entered)
,year(date_entered)) e
on d.weekClosed = e.weekEntered
and d.yearClosed = e.yearEntered) f
on c.period = f.period
group by
c.period
,resolved_half1
,resolved_half2
,opened_half1
,opened_half2
,c.yearClosed
,c.weekClosed
)
SELECT
row
,Period
,x1
,y1
,x2
,y2
,m = ((y1 - y2)/(x1 - x2))
,b = (y2 - (((y1 - y2)/(x1 - x2)) * x2))
,trend = ((((y1 - y2)/(x1 - x2)) * (row)) + (y2 - (((y1 - y2)/(x1 - x2)) * x2)))
from cte
order by row
作爲附錄,所有子查詢「c」co將其替換爲以下內容,並且稍微修改版本的「f」。更好或更差的性能取決於表格大小,索引和其他imponderables。
select
datepart(wk, date_closed) weekClosed
,year(date_closed) yearClosed
,count (distinct case
when date_closed >= @FullInterval then TicketNbr
else null
end) resolved_half1
,count (distinct case
when date_entered >= @FullInterval then TicketNbr
else null
end) opened_half1
from v_rpt_Service
where date_closed >= @FullInterval
or date_entered >= @FullInterval
group by
datepart(wk, date_closed)
,year(date_closed)
這是用於MS SQLServer還是用於不同的RDBMS? – 2012-04-11 13:46:43
MS SQLServer是正確的。 – 2012-04-11 13:59:11