2009-06-15 17 views
0

単一のSQL文で複数のカウントを実行しようとしています。SQL、複数の結果を含む複数のカウント

私には2人のマークとクリスがいます。

特定の日に電車に乗る回数をカウントしたいと思います。ここに私が使用しているコードがあります。

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

あなたはサブクエリに1より多くの条件が必要になります。

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をカウントしますか? –

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

関連する問題