SQL,具有多个结果的多个计数

时间:2009-06-15 09:49:39

标签: 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

等...

任何人都可以看到我的代码出现问题吗?

感谢所有帮助

3 个答案:

答案 0 :(得分: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 :(得分: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

答案 2 :(得分: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')