2013-04-09 39 views
12

Tôi cần nhóm theo trường được Tính toán SQL Server 2005/2008.Cách nhóm theo Trường được Tính toán

Tôi có sql sau:

select dateadd(day, -7, Convert(DateTime, mwspp.DateDue) + (7 - datepart(weekday, mwspp.DateDue))), 
sum(mwspp.QtyRequired) 
from manufacturingweekshortagepartpurchasing mwspp 
where mwspp.buildScheduleSimID = 10109 and mwspp.partID = 8366 
group by mwspp.DateDue 
order by mwspp.DateDue 

Thay vì group by mwspp.DateDue tôi cần phải nhóm bởi kết quả của phép tính. Có thể không?

Cảm ơn trước

Trả lời

20

Chắc chắn, chỉ cần thêm các tính toán tương tự với GROUP BY khoản:

select dateadd(day, -7, Convert(DateTime, mwspp.DateDue) + (7 - datepart(weekday, mwspp.DateDue))), 
sum(mwspp.QtyRequired) 
from manufacturingweekshortagepartpurchasing mwspp 
where mwspp.buildScheduleSimID = 10109 and mwspp.partID = 8366 
group by dateadd(day, -7, Convert(DateTime, mwspp.DateDue) + (7 - datepart(weekday, mwspp.DateDue))) 
order by dateadd(day, -7, Convert(DateTime, mwspp.DateDue) + (7 - datepart(weekday, mwspp.DateDue))) 

Chỉnh sửa sau khi bình luận:

Giống như tất cả những câu hỏi liên quan đến việc optimizer, câu trả lời là thực sự "nó phụ thuộc", nhưng rất có thể nó sẽ chỉ được thực hiện một lần - bạn sẽ thấy điều này trong kế hoạch thực hiện như là Tính toán Scalar operato r.

Dựa trên thao tác này Tính toán Scalar, trình tối ưu hóa sau đó sẽ quyết định cách thực hiện tổng hợp thực tế.

Các câu trả lời khác ở đây (CTE/truy vấn con, v.v.) đều hợp lệ, nhưng không thực sự thay đổi logic - cuối cùng chúng sẽ thực hiện các hoạt động tương tự. SQL Server có thể đối xử với họ khác nhau nhưng không chắc. Tuy nhiên, chúng sẽ giúp dễ đọc.

Nếu bạn lo lắng về hiệu quả, bạn có thể xem xét một vài tùy chọn, ví dụ: thiết lập phép tính dưới dạng persisted computed column và sử dụng phép tính này trong chỉ mục hoặc thêm kết quả tạm thời vào bảng tạm thời.

Cách duy nhất để thực sự biết chắc chắn là kiểm tra số liệu thống kê Execution Plan/IO khi chạy truy vấn trên tập dữ liệu điển hình và xem liệu bạn có hài lòng với hiệu suất hay không; nếu không, có lẽ điều tra một trong các tùy chọn trên.

+1

Cảm ơn, nhưng không phải là này một chút đắt tiền? hoặc máy chủ sql bằng cách nào đó tối ưu hóa nó để thực hiện tính toán chỉ một lần? – Jonny

+0

@Jonny, tôi đã thêm một vài suy nghĩ - điều tốt nhất để làm là cung cấp cho nó một shot trên dữ liệu của bạn và xem nếu nó là OK - nếu không, hãy xem các tùy chọn khác để cải thiện hiệu quả tại thời điểm đó. –

+0

Cá nhân, tôi mong đợi hiệu suất của cả bốn câu trả lời là khá giống nhau - sự khác biệt chính là cách tiếp cận được tôi và Bluefeet sử dụng nhiều hơn các câu trả lời khác, vì chúng tôi chỉ phải tính toán một lần . –

12

Nếu bạn muốn GROUP BY tính dateadd, sau đó bạn sẽ có cần phải đặt công thức trong mệnh đề GROUP BY hoặc bạn có thể quấn truy vấn của bạn trong một CHỌN:

select DateCalc, 
    sum(QtyRequired) TotalQty 
from 
(
    select mwspp.DateDue, 
    dateadd(day, -7, Convert(DateTime, mwspp.DateDue) + (7 - datepart(weekday, mwspp.DateDue))) DateCalc, 
    mwspp.QtyRequired 
    from manufacturingweekshortagepartpurchasing mwspp 
    where mwspp.buildScheduleSimID = 10109 
    and mwspp.partID = 8366 
) src 
group by DateCalc 
order by DateCalc 
3

Có một số cách làm như vậy - một trong những liên quan đến việc sử dụng một CTE:

with cte as 
(select m.*, 
     dateadd(day, -7, Convert(DateTime, DateDue) + (7 - datepart(weekday, DateDue))) datecalc 
from manufacturingweekshortagepartpurchasing m) 
select datecalc, sum(QtyRequired) 
from cte 
where buildScheduleSimID = 10109 and partID = 8366 
group by datecalc 
order by datecalc 
2

Đơn giản chỉ cần đặt các tính toán trong mệnh đề GROUP BY:

Thay thế

group by mwspp.DateDue 

Để

group by dateadd(day, -7, Convert(DateTime, mwspp.DateDue) + (7 - datepart(weekday, mwspp.DateDue))) 
Các vấn đề liên quan