2009-06-15 12 views
0

Je tente d'effectuer plusieurs comptes dans une seule instruction SQL.SQL, plusieurs comptes avec plusieurs résultats

J'ai deux personnes, Mark et Chris.

Je veux compter combien de fois chacun prend le train à une certaine date. Voici le code que j'utilise. Le format que ce code produit est correct, mais le résultat ne l'est pas. Le résultat est

TO_DATE  Mark  Chris 
2009-01-01  8   11 
2009-01-02  8   11 
2009-01-03  8   11 

etc ....

Le résultat correct devrait

TO_DATE  Mark  Chris 
2009-01-01  8   11 
2009-01-02  3   7 
2009-01-03  6   5 

etc ...

Quelqu'un peut-il voir le problème avec mon code?

Toute aide est appréciée

Répondre

2

Vous avez besoin d'une condition supplémentaire dans les sous-requêtes:

AND TO_DATE(ti.DEPARTURE_DATE,'YYYYMM') = TO_DATE(to.DEPARTURE_DATE,'YYYYMM') 

SELECT TO_DATE(TRAIN.DEPARTURE_DATE,'YYYYMM') 
    , (select COUNT(DISTINCT DEPARTURE_DATE) 
    FROM TRAIN ti 
    WHERE PERSON_ID='28' AND DEPARTURE_STATION = 'DUBLIN' AND TO_DATE(ti.DEPARTURE_DATE,'YYYYMM') = TO_DATE(to.DEPARTURE_DATE,'YYYYMM')) AS Mark 
    , (select COUNT(DISTINCT DEPARTURE_DATE) 
    FROM TRAIN 
    WHERE PERSON_ID='29' AND DEPARTURE_STATION = 'DUBLIN' AND TO_DATE(ti.DEPARTURE_DATE,'YYYYMM') = TO_DATE(to.DEPARTURE_DATE,'YYYYMM')) AS Chris 
FROM TRAIN to 
GROUP BY DEPARTURE_DATE 
+0

COUNT (DISTINCT DEPARTURE_DATE) comptera seulement 1 si vous sélectionnez le DEPARTURE_DATE? –

4

Essayez ceci:

SELECT TO_DATE(TRAIN.DEPARTURE_DATE,'YYYYMM') 
    , (select COUNT(*) 
    FROM TRAIN 
    WHERE PERSON_ID='28' AND DEPARTURE_STATION = 'DUBLIN' 
    AND DepartureDate = t.DepartureDate) AS Mark 
    , (select COUNT(*) 
    FROM TRAIN 
    WHERE PERSON_ID='29' AND DEPARTURE_STATION = 'DUBLIN' 
    AND DepartureDate = t.DepartureDate) AS Chris 
FROM TRAIN t 
GROUP BY DEPARTURE_DATE 
1

Vous n'avez pas besoin de plusieurs requêtes sous corrélées ici et peut utilisez plutôt une technique PIVOT.

SELECT TO_DATE(TRAIN.DEPARTURE_DATE, 'YYYYMM'), 
     SUM(CASE 
      WHEN person_id = 28 THEN 1 
      ELSE 0 
      END) Mark, 
     SUM(CASE 
      WHEN person_id = 29 THEN 1 
      ELSE 0 
      END) Chris 
FROM TRAIN 
WHERE DEPARTURE_STATION = 'DUBLIN' 
     AND person_id IN (28, 29) 
GROUP BY TO_DATE(TRAIN.DEPARTURE_DATE, 'YYYYMM') 
+0

c'est beaucoup plus rapide que les réponses précédentes. – joey

Questions connexes