2010-03-11 4 views
9

У меня есть таблица с коллекцией заказов. Поля:TSQL: группировка заказов клиентов по неделям

  • customerName (текст)
  • DateOfOrder (DateTime).

Я бы хотел показать общее количество заказов в неделю на одного клиента. Я хотел бы, чтобы он организовал для пятницы каждой недели, так что это выглядит следующим образом:

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 

Может кто-нибудь, пожалуйста, покажите мне, как это сделать?

Thanks

ответ

15

Сделайте поле, с которым вы можете легко связаться.

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

20000107 - известная пятница.

2

Это не полный заказ, но он даст вам неделю #. Просто нужно добавить группировку.

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

Просто попробуйте дать этому идти

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 

Выходной

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 

Если я пропустил что-то с датами в пятницу, дайте мне знать, чтобы я мог посмотреть.

1

Это будет работать до тех пор, пока нет времени компонента:

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

Это предполагает, что DATEFIRST не была изменена. Вычитание вернется к предыдущей субботе, затем + 7 до пятницы.

Если есть время компонент, используйте один из стандартных методов, чтобы лишить его:

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

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

или, SS2008

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

Я думал, что я хотел бы добавить, это, так как я не сделал как и лучший ответ, как я мог. Он просто вычитает будний день, а затем добавляет обратно в нужный день. Отрегулируйте 6, если вы хотите другой день недели (или если ваш DATEFIRST установлен по-другому, из того, что я собираю).

SELECT Friday, COUNT(CustomerName) 
FROM 
(
SELECT *, 
    CAST(DATEADD(d, 6 - DATEPART(dw,DateOfOrder), DateOfOrder) AS date) AS Friday 
FROM Orders 
) o 
GROUP BY Friday; 
Смежные вопросы