用于COUNT和GROUP BY的SQL

时间:2013-05-28 17:47:21

标签: sql ms-access ms-access-2007

这是我在本网站发布问题的第一次经历:)所以,我遇到了麻烦。我有一个访问数据库,我用ODBC连接。

数据库有3个表:

nombres : (-idnombre, -nombre)
rutas   : (-idruta, ruta)
fechas  : (-idfecha, idruta, idnombre, fecha)

示例数据:

nombres:(1,nombreA),(2,nombreB)
Rutas:(1,rutaA),(2,RutaB)
fechas:(1,1,1,28/06/2013), (2,2,1,28/06/2013), (3,2,2,28/06/2013),(4,2,2,28/06/2013)

所以我需要这个输出(第三个字段是一个计数):

rutaA - nombreA - 1 time
rutaA - nombreB - 0 times
rutaB - nombreA - 1 time
rutaB - nombreB - 2 times

我的sql是:

SELECT rutas.ruta, nombres.nombre, Count(fechas.idruta) AS CuentaDeidruta
FROM rutas INNER JOIN 
    (nombres INNER JOIN fechas ON nombres.idnombre = fechas.idnombre) 
    ON rutas.idruta = fechas.idruta
GROUP BY rutas.ruta, nombres.nombre;

没关系,但没有显示零计数。所以我的输出是:

rutaA - nombreA - 1 time
rutaB - nombreA - 1 time
rutaB - nombreB - 2 times

我尝试使用左连接,所以我遇到了一些错误。

1 个答案:

答案 0 :(得分:1)

我认为你正在寻找Rutas和Nombres的Cartesian Product,因此在你的样本数据中给你这样的东西,rutaA和nombreB之间没有相关性。

SELECT t.ruta, t.nombre, Count(fechas.idruta) AS CuentaDeidruta 
FROM (
    SELECT rutas.idruta, rutas.ruta, nombres.idnombre, nombres.nombre
    FROM rutas, nombres
  ) t
  LEFT JOIN fechas ON 
    t.idnombre = fechas.idnombre AND fechas.idruta = t.idruta
GROUP BY t.ruta, t.nombre;

这适用于SQL Server,但应该非常接近MS Access。另请注意LEFT JOIN的使用情况,以确保您获得缺少的0。