2009-06-15 71 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

如果您在DEPARTURE_DATE選擇,COUNT(DISTINCT DEPARTURE_DATE)只計數1嗎? – 2009-06-15 14:07:51

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 2013-07-31 09:48:16