2009-06-15 2 views
0

Я пытаюсь сделать несколько отсчетов в одном заявлении sql.SQL, несколько счетчиков с несколькими результатами

У меня есть два человека, Марк и Крис.

Я хочу рассчитать, сколько раз каждый из них отправляется на поезд на определенную дату. Вот код, который я использую.

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

Формат, который производит этот код, является правильным, однако результата нет. В результате

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

и т.д ....

правильный результат должен

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

и т.д ...

Может кто-нибудь увидеть проблему с моим кодом?

Вся помощь ценится

ответ

2

Вам необходимо еще одно условия в подзапросах:

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) только считать 1, если вы выбираете DEPARTURE_DATE? –

4

Попробуйте это:

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

Вам не нужны несколько коррелированных подзапросов здесь и могут используйте вместо этого метод 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

это намного быстрее, чем предыдущие ответы. – joey

Смежные вопросы