2010-03-11 10 views
9

Tengo una tabla con una colección de pedidos. Los campos son:TSQL: agrupación de pedidos de clientes por semana

  • customerName (texto)
  • DateOfOrder (fecha y hora).

Me gustaría mostrar totales de pedidos por semana por cliente. Me gustaría tenerlo preparado para el viernes de cada semana para que se parezca a esto:

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 

Podría alguien por favor me muestran cómo hacer esto?

Gracias

Respuesta

15

Haga un campo que pueda agrupar más fácilmente.

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

20000107 es un viernes conocido.

2

Esto no es un pedido completo, pero le dará la semana #. Solo necesito agregar agrupación.

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

sólo tratar de dar a este un ir

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 

salida

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 

Si me he perdido algo con las fechas del viernes, que me haga saber para que pueda echar un vistazo.

1

Esto funcionará siempre y cuando no hay un componente de tiempo:

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

Esto supone que DATEFIRST no se ha cambiado. La resta se retrotraerá a los previos el sábado, luego +7 llegará al viernes.

Si hay un componente de tiempo, utilice una de las técnicas estándar para despojar a lo apaga:

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

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

o, por SS2008

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

pensé que iba a añadir este ya no lo hice me gusta la mejor respuesta existente tan bien como pude. Simplemente resta el día de la semana y luego vuelve al día deseado. Ajuste el 6 si desea un día diferente de la semana (o si su DATEFIRST se establece de manera diferente, por lo que yo reúno).

SELECT Friday, COUNT(CustomerName) 
FROM 
(
SELECT *, 
    CAST(DATEADD(d, 6 - DATEPART(dw,DateOfOrder), DateOfOrder) AS date) AS Friday 
FROM Orders 
) o 
GROUP BY Friday;