2010-03-11 5 views
9

J'ai une table avec une collection de commandes. Les champs sont:TSQL: regroupement des commandes clients par semaine

  • customerName (texte)
  • DateOfOrder (datetime).

Je voudrais montrer le total des commandes par semaine par client. Je voudrais avoir pris des dispositions pour le vendredi de chaque semaine pour qu'il ressemble à ceci:

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 

Quelqu'un pourrait-il s'il vous plaît me montrer comment faire cela?

Merci

Répondre

15

Créez un champ que vous pouvez regrouper plus facilement.

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

20000107 est un vendredi connu.

2

Ce n'est pas une commande complète, mais il vous donnera la semaine #. Juste besoin d'ajouter le groupement.

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

Juste essayer de donner un aller

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 

Sortie

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 je raté quelque chose avec les dates vendredi, permettez-moi de savoir que je peux avoir un coup d'oeil.

1

Cela fonctionne tant qu'il n'y a pas de composante de temps:

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

Cela suppose que DATEFIRST n'a pas été modifié. La soustraction reviendra au samedi précédent, puis + 7 arrivera au vendredi.

S'il y a un élément de temps, utiliser l'une des techniques standard pour dépouiller off:

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

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

ou, pour SS2008

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

Je pensais que j'ajouterais cela depuis que je ne l'ai pas comme la meilleure réponse existante aussi bien que je le pouvais. Il soustrait juste le jour de la semaine, puis rajoute au jour désiré. Ajustez le 6 si vous voulez un jour différent de la semaine (ou si votre DATEFIRST est réglé différemment, d'après ce que je comprends).

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