2010-11-22 40 views
1

Ci-dessous une requête simple et le résultat: Est-ce un moyen d'agréger le total des événements de 7 jours, puis résumer le total des événements? Une fonction de cumul fonctionnerait-elle? J'utilise SQL Server 05 & 08. Merci encore, les gens.répartition par semaines

SELECT DATE_SOLD, count(DISTINCT PRODUCTS) AS PRODUCT_SOLD  
FROM PRODUCTS  
WHERE DATE >='10/1/2009' 
and DATE <'10/1/2010' 
GROUP BY DATE_SOLD 

RÉSULTATS:

DATE_SOLD   PRODUCT_SOLD 
10/1/09   5 
10/2/09   11 
10/3/09   14 
10/4/09   6 
10/5/09   11 
10/6/09   13 
10/7/09   10 
Total    70 

10/8/09   4 
10/9/09   11 
10/10/09    8 
10/11/09    4 
10/12/09    7 
10/13/09    4 
10/14/09    9 
Total    47 
+0

Etes-vous en train d'essayer d'obtenir un résultat qui ressemble à un rapport, comme vous l'avez dans votre exemple, ou voulez-vous que le résultat de votre requête soit simplement un total? – CodeMonkey1313

+0

Je voudrais que la requête soit totalisée en premier, puis la sortie comme l'exemple ci-dessus. – joe

+0

Pouvez-vous publier le code SQL utilisé pour créer la table "MYTABLE". Cela rendrait plus facile de voir ce que vous essayez de faire. Vous devriez également envisager d'utiliser différents noms de champs comme DATE et EVENTS sont des mots-clés dans SQL Server – Tony

Répondre

0

Ne pas avoir la conception de votre table pour travailler avec voici ce que je pense que vous êtes après (même si je dois admettre que la sortie doit être nettoyé). Cela devrait au moins vous aider à trouver la solution que vous cherchez.

CREATE TABLE MyTable( 
event_date date, 
event_type char(1) 
) 
GO 

INSERT MyTable VALUES ('2009-1-01', 'A') 
INSERT MyTable VALUES ('2009-1-11', 'B') 
INSERT MyTable VALUES ('2009-1-11', 'C') 
INSERT MyTable VALUES ('2009-1-20', 'N') 
INSERT MyTable VALUES ('2009-1-20', 'N') 
INSERT MyTable VALUES ('2009-5-23', 'D') 
INSERT MyTable VALUES ('2009-5-23', 'E') 
INSERT MyTable VALUES ('2009-5-10', 'F') 
INSERT MyTable VALUES ('2009-5-10', 'F') 
GO 

WITH T AS (
    SELECT DATEPART(MONTH, event_date) event_month, event_date, event_type 
    FROM MyTable 
) 

SELECT CASE WHEN (GROUPING(event_month) = 0) 
      THEN event_month ELSE '99' END AS event_month, 
     CASE WHEN (GROUPING(event_date) = 1) 
      THEN '9999-12-31' ELSE event_date END AS event_date, 
    COUNT(DISTINCT event_type) AS event_count 
FROM T 
GROUP BY event_month, event_date WITH ROLLUP 
ORDER BY event_month, event_date 

Cela donne le résultat suivant:

event_month event_date event_count 
1   2009-01-01  1 
1   2009-01-11  2 
1   2009-01-20  1 
1   9999-12-31  4 
5   2009-05-10  1 
5   2009-05-23  2 
5   9999-12-31  3 
99   9999-12-31  7 

Lorsque le '99' pour le mois et '9999-12-31' pour l'année sont les totaux.

+2

Désolé, je viens de réaliser que j'ai donné la répartition par mois et non par semaine, je dois être fatigué. Je suis sûr que vous pouvez modifier le code pour apporter les modifications nécessaires. – Tony

0
SELECT DATEDIFF(week, 0, DATE_SOLD) Week, 
    DATEADD(week, DATEDIFF(week, 0, DATE_SOLD), 0) From, 
    DATEADD(week, DATEDIFF(week, 0, DATE_SOLD), 0) + 6 To, 
    COUNT(DISTINCT PRODUCTS) PRODUCT_SOLD 
FROM dbo.PRODUCTS 
WHERE DATE >= '2009-10-01' 
    AND DATE < '2010-10-01' 
GROUP BY DATEDIFF(week, 0, DATE_SOLD) WITH ROLLUP 
ORDER BY DATEDIFF(week, 0, DATE_SOLD)