Tôi đã quan tâm đến vấn đề này và tôi đã tìm ra cách tốt nhất để tìm kiếm một truy vấn phức tạp là định dạng lại nó bằng cách sử dụng phong cách và quy ước của riêng tôi. Tôi áp dụng chúng cho giải pháp của bạn, và kết quả là dưới đây. Tôi không biết nếu điều này sẽ có giá trị gì đối với bạn ...
- Có một vài bit của mã mà tôi không tin là một phần của cú pháp MS T-SQL, chẳng hạn như
({fn xxx }
và WEEK(xxx)
chức năng.
- Mã này biên dịch, nhưng tôi không thể chạy vì tôi không có bảng dữ liệu được định cấu hình đúng cách.
- Tôi đã tạo ra một loạt các thay đổi về mã hóa sẽ tốn nhiều thời gian để giải thích và tôi sẽ bỏ qua hầu hết điều đó. Thêm nhận xét nếu bạn muốn bất kỳ điều gì được giải thích.
- Tôi đã ném vào rất nhiều khoảng trắng. Sự khác biệt giữa các mã dễ đọc và dễ đọc thường chỉ là sự nhận thức và sự nhạy cảm của kẻ thù, và bạn có thể ghét các quy ước của tôi.
- Không chắc chắn về tập kết quả cuối cùng sẽ được (tức là cột có được trả lại)
Một số thêm ghi chú:
- Truy vấn này sẽ không nhận được mặt hàng nhập vào một tuần nếu không có mục nào cũng đóng cửa trong tuần đó
- Tuần có thể là một phần, ví dụ: không phải tất cả bảy ngày có thể có mặt (điều chỉnh @Interval để luôn bao gồm cả tuần đầy đủ - nhưng khoảng kỳ số lẻ?)
- Nhân số giá trị (*) với 1.0 để chuyển đổi chúng thành phao sớm (tránh toán học và số nguyên cắt ngắn)
- Made nó một CTE để cho phép các công thức trước đó được thay thế bằng biểu tượng trong các công thức sau (lúc này mọi thứ trở nên rất nhiều dễ đọc hơn)
Vì vậy, đây là những gì tôi đã đưa ra:
;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
Là một phụ lục, tất cả các truy vấn phụ "c" co uld được thay thế bằng một cái gì đó như sau, và "f" với một phiên bản hơi sửa đổi. Hiệu suất tốt hơn hoặc tệ hơn phụ thuộc vào kích thước bảng, lập chỉ mục và các yếu tố khác.
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)
Đây có phải là MS SQLServer hoặc cho RDBMS khác không? –
MS SQLServer là chính xác. –