TSQL: группировка заказов клиентов по неделям - PullRequest
9 голосов
/ 12 марта 2010

У меня есть таблица с коллекцией заказов. Поля:

  • customerName (текст)
  • DateOfOrder (дата / время).

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

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

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

Спасибо

Ответы [ 5 ]

15 голосов
/ 12 марта 2010

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

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

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

2 голосов
/ 08 марта 2012

Я думал, что добавлю это, так как мне не понравился существующий лучший ответ, как я мог. Он просто вычитает день недели и затем добавляет обратно к желаемому дню. Настройте 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;
2 голосов
/ 12 марта 2010

Просто попробуйте попробовать

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

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

2 голосов
/ 12 марта 2010

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

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
1 голос
/ 12 марта 2010

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

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...