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