2010-03-11 25 views
9

Tôi có một bảng với một tập hợp các đơn đặt hàng. Các lĩnh vực là:TSQL: nhóm các đơn đặt hàng của khách hàng theo tuần

  • customerName (văn bản)
  • DateOfOrder (datetime).

Tôi muốn hiển thị tổng số đơn đặt hàng mỗi tuần cho mỗi khách hàng. Tôi muốn có nó được sắp xếp cho thứ Sáu của mỗi tuần để nó trông như thế này:

all dates follow mm/dd/yyyy 

"bobs pizza", 3/5/2010, 10 
"the phone co",3/5/2010,5 
"bobs pizza", 3/12/2010, 3 
"the phone co",3/12/2010,11 

Ai đó có thể cho tôi biết cách làm điều này?

Cảm ơn

Trả lời

15

Tạo trường mà bạn có thể nhóm theo cách dễ dàng hơn.

SELECT COUNT(OrderID), WeekStart 
FROM 
(
SELECT *, 
    dateadd(week, datediff(day,'20000107',yourDate)/7, '20000107') AS WeekStart 
FROM Orders 
) o 
GROUP BY WeekStart; 

20000107 là thứ sáu được biết đến.

2

Đây không phải là đơn đặt hàng hoàn chỉnh, nhưng nó sẽ cung cấp cho bạn tuần #. Chỉ cần thêm nhóm.

SELECT 
Cast(DatePart(YEAR, dateadd(month, datediff(month, 0, DateOfOrder),0)) 
    AS nvarchar(20)) 
+ ' ' 
+ RIGHT('0' + Cast(DatePart(WK, DateOfOrder) AS nvarchar(20)), 2) 
,CustomerName 
FROM Orders 
2

Chỉ cần cố gắng để cung cấp cho này một đi

DECLARE @Table TABLE(
     customerName VARCHAR(50), 
     DateOfOrder DATETIME, 
     Quantity FLOAT 
     ) 

INSERT INTO @Table SELECT 'bobs pizza', '1/5/2010', 10  
INSERT INTO @Table SELECT 'bobs pizza', '3/5/2010', 10 
INSERT INTO @Table SELECT 'bobs pizza', '3/4/2010', 10 
INSERT INTO @Table SELECT 'the phone co','3/5/2010',5 
INSERT INTO @Table SELECT 'bobs pizza', '3/12/2010', 3 
INSERT INTO @Table SELECT 'the phone co','3/12/2010',11 
INSERT INTO @Table SELECT 'the phone co','3/13/2010',11 
INSERT INTO @Table SELECT 'the phone co','3/15/2010',11 


SELECT DateFirday, 
     DATENAME(dw, DateFirday), 
     SUM(Quantity) Total 
FROM (
      SELECT *, 
        DATEADD(week, DATEPART(WEEK, DateOfOrder) - 1, CAST('01 Jan' + CAST(DATEPART(year,DateOfOrder) AS VARCHAR(4)) AS DATETIME)) DateFirday 
      FROM @Table 
     ) sub 
GROUP BY DateFirday 

Output

DateFirday            Total 
----------------------- ------------------------------ ---------------------- 
2010-01-08 00:00:00.000 Friday       10 
2010-03-05 00:00:00.000 Friday       25 
2010-03-12 00:00:00.000 Friday       25 
2010-03-19 00:00:00.000 Friday       11 

Nếu tôi bị mất một cái gì đó với ngày thứ Sáu, cho tôi biết để tôi có thể có một cái nhìn.

1

này sẽ làm việc càng lâu càng không có thành phần thời gian:

SELECT  DateOfOrder - DATEPART(dw, DateOfOrder) + 7 AS weekEndingDate, customerName, COUNT(*) AS totalOrders 
FROM   Orders 
GROUP BY DateOfOrder - DATEPART(dw, DateOfOrder) + 7, customerName 

này giả định rằng DATEFIRST chưa được thay đổi. Phép trừ sẽ quay trở lại trạng thái chiến thắng thứ Bảy, sau đó + 7 được tính đến thứ Sáu.

Nếu có một phần thời gian, sử dụng một trong những kỹ thuật tiêu chuẩn để tước nó đi:

DATEADD(day, DATEDIFF(day, 0, DateOfOrder), 0) - DATEPART(dw, DateOfOrder) + 7 

CAST(FLOOR(CAST(DateOfOrder as FLOAT)) as DATETIME) - DATEPART(dw, DateOfOrder) + 7 

hoặc, đối với SS2008

CAST(DateOfOrder AS date) - DATEPART(dw, DateOfOrder) + 7 
2

Tôi nghĩ tôi sẽ thêm này kể từ khi tôi đã không giống như câu trả lời tốt nhất hiện tại cũng như tôi có thể. Nó chỉ trừ đi các ngày trong tuần và sau đó thêm trở lại vào ngày mong muốn. Điều chỉnh 6 nếu bạn muốn một ngày khác trong tuần (hoặc nếu DATEFIRST của bạn được đặt khác, từ những gì tôi thu thập).

SELECT Friday, COUNT(CustomerName) 
FROM 
(
SELECT *, 
    CAST(DATEADD(d, 6 - DATEPART(dw,DateOfOrder), DateOfOrder) AS date) AS Friday 
FROM Orders 
) o 
GROUP BY Friday; 
Các vấn đề liên quan