私はこの問題に興味があり、複雑なクエリを理解する最善の方法は、独自のスタイルと規則を使用して再フォーマットすることであることがわかりました。それらをあなたのソリューションに適用しました。結果は以下のとおりです。これがあなたにとって価値があるかどうかはわかりません...
({fn xxx }
andWEEK(xxx)
関数など、MS T-SQL 構文の一部とは思えないコードがいくつかありました。
- このコードはコンパイルされますが、データ テーブルが適切に構成されていないため実行できません。
- 私は多くのコーディングの変更を行いましたが、それらはかなり多くの説明を要しますが、そのほとんどは省略します。説明が必要な場合は、コメントを追加してください。
- 余白をたくさん入れました。判読できるコードと判読できないコードの違いは、多くの場合、見る人の認識と感性にすぎないため、私の慣習を嫌うかもしれません。
- 最終的な結果セットがどうあるべきかわからない (つまり、どの列が返されるか)
さらにいくつかの注意事項:
- このクエリは、その週にアイテムがクローズされていない場合、その週に入力されたアイテムを取得しません
- 週は部分的である場合があります。たとえば、7 日すべてが存在するわけではありません (@Interval を調整して、常に完全な週を含めるようにします -- しかし、奇数の間隔はどうでしょうか?)
- count(*) 値に 1.0 を掛けて、早い段階で float に変換します (キャストと整数演算の切り捨てを回避します)。
- 以前の数式を後の数式の記号に置き換えることができるように 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」のすべてを次のようなものに置き換え、「f」をわずかに変更したバージョンに置き換えることができます。パフォーマンスの良し悪しは、テーブルのサイズ、インデックス作成、およびその他の計り知れない要素によって異なります。
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)