2011-02-16 5 views
0

Je voudrais obtenir un résultat d'une table:Regroupement des résultats différents de même table

Date Charges 

22/04/2010 1764 
22/04/2010 200 
22/04/2010 761 
22/04/2010 3985 
22/04/2010 473 
22/04/2010 677 
22/04/2010 1361 
22/04/2010 6232 
22/04/2010 4095 
23/04/2010 7224 
23/04/2010 1748 
23/04/2010 1355 
23/04/2010 2095 
23/04/2010 2063 
23/04/2010 2331 
23/04/2010 2331 
23/04/2010 4473 
23/04/2010 478 
23/04/2010 1901 
23/04/2010 1250 
23/04/2010 1743 
24/04/2010 1743 
24/04/2010 3923 
24/04/2010 1575 
24/04/2010 1859 
24/04/2010 2431 
24/04/2010 1208 
24/04/2010 158 
24/04/2010 3246 
24/04/2010 2898 
24/04/2010 1517 
24/04/2010 2368 
24/04/2010 961 
24/04/2010 4111 
24/04/2010 3066 
24/04/2010 740 
25/04/2010 2651 
25/04/2010 2693 
25/04/2010 4847 
25/04/2010 312 
25/04/2010 1247 
25/04/2010 5858 
25/04/2010 1040 
25/04/2010 941 
25/04/2010 942 
25/04/2010 1784 
25/04/2010 418 
25/04/2010 2248 
25/04/2010 1834 
25/04/2010 418 
25/04/2010 2263 
26/04/2010 2746 
26/04/2010 942 
26/04/2010 883 
26/04/2010 3339 
26/04/2010 3517 
26/04/2010 761 
26/04/2010 1738 
26/04/2010 1370 
26/04/2010 1501 
26/04/2010 1197 
26/04/2010 2452 
26/04/2010 209 
26/04/2010 1092 
26/04/2010 4316 
26/04/2010 1208 
26/04/2010 1213 
26/04/2010 2179 
26/04/2010 1213 
26/04/2010 1538 
26/04/2010 1939 
26/04/2010 956 
26/04/2010 10715 
26/04/2010 4321 
26/04/2010 956 
26/04/2010 2975 
26/04/2010 798 
26/04/2010 1738 

où il montre les champs suivants:

Date, comte de> 2500, Total de> 2500, Nombre total et grand totale entre 1/4/2010 à 30/4/2010

i.e. 
22/4/2010, 3, 14312, 9, 19548 
23/4/2010, 2, 11697, 12, 28992 
24/4/2010, 5, 17244, 15, 31804 
25/4/2010, 4, 16049, 15, 29496 
26/4/2010, 7, 31929, 27, 57812 

...
...

Toutes les aides sont très appréciées! Merci d'avance.

+0

Quels SGBD utilisez-vous? – bluish

+0

J'utilise MS SQL Server 2008 R2 –

+0

je parviens à obtenir seulement: SELECT \t DATEPART (Jour, DateTimeActivity) comme le jour, \t COUNT (*) AS Visits_RM25, \t SUM (Frais) AS MM_Spending_RM25 \t DE AccActivity OÙ \t frais> = 2500 ET DateTimeActivity> = '04/01/2010' ET DateTimeActivity <'04/30/2010' GROUP BY DATEPART (jour, DateTimeActivity) ORDER BY Datepart (Day, DateTimeActivity) –

Répondre

2

Principes de base serait d'utiliser SUM et CASE, quelque chose comme:

SELECT 
    DATEADD(day,DATEDIFF(day,'20010101',DateTimeActivity),'20010101') as Date, 
    SUM(CASE WHEN Charges > 2500 THEN 1 ELSE 0 END) as Count2500, 
    SUM(CASE WHEN Charges > 2500 THEN Charges END) as Sum2500, 
    COUNT(*) as CountTotal, 
    SUM(Charges) as SumTotal 
FROM 
    AccActivity 
WHERE 
    DateTimeActivity >= '20100401' and 
    DateTimeActivity < '20100501' 
GROUP BY 
    DATEADD(day,DATEDIFF(day,'20010101',DateTimeActivity),'20010101') 

jour à base de votre commentaire, d'utiliser les vrais noms de table/colonne. Je suppose que vous voulez inclure les transactions qui ont lieu le 30 avril.

Notez que j'utilise un format de date sécurisé pour mes littéraux de date (AAAAMMJJ) - la plupart des autres formats sont ambigus en fonction des paramètres régionaux sur le serveur. De plus, j'utilise DATEADD(day,DATEDIFF(day,'20010101',DateTimeActivity),'20010101') pour enlever le composant time du datetime - il a l'air légèrement funky, mais il est assez rapide, et le même pattern peut être utilisé pour faire d'autres conversions de datetime relativement facilement (par exemple si vous devez groupe sur les mois, vous pouvez simplement changer les deux day options pour month, et les dates seront tous mis à la 1ère de leur mois respectif)

+0

Oh, quel type de faute vexatoire! Vous vouliez certainement dire "COUNT (CASE WHEN CHARGES> 2500 THEN 1 ELSE 0 END) comme Count2500', n'est-ce pas? –

+0

@Andriy M - SUM fonctionne ici aussi bien que COUNT (Si j'avais voulu COUNT, j'aurais laissé l'expression CASE comme NULL pour ceux que je ne voulais pas compter) –

+0

@Damien_The_Unbeliever: Oups, tu as raison . Ici, je ne fais plus attention, quelle honte. Pardon. –

1

vous pouvez essayer avec:

SELECT date, 
     count(if(charges>2500, 1, NULL)) as countGt2500, 
     sum(if(charges>2500, charges, 0)) as totalGt2500, 
     count(charges) as countTotal, 
     sum(charges) as sumTotal, 
    FROM yourTable 
WHERE date >= '2010/04/01' 
    AND date <= '2010/04/30' 
GROUP BY date; 

Si vous avez enregistré le plein datetime sur la date du champ, vous devez extraire la partie de date du datet Pour ce faire, vous pouvez utiliser la fonction DATE de la manière suivante:

SELECT DATE(date) as day, 
     count(if(charges>2500, 1, NULL)) as countGt2500, 
     sum(if(charges>2500, charges, 0)) as totalGt2500, 
     count(charges) as countTotal, 
     sum(charges) as sumTotal, 
    FROM yourTable 
WHERE date >= '2010/04/01' 
    AND date <= '2010/04/30' 
GROUP BY day; 
+0

manquant où clause à filtrer seulement avril 2010 jours – bluish

+0

C'est vrai, je n'ai pas vu cette restriction. J'ai ajouté la condition à la réponse. Merci – Borja

+0

Merci Borja pour votre aide aussi :). –

Questions connexes