1

这是我在这个网站上发布问题的第一次体验 :) 所以,我遇到了麻烦。我有一个可以访问的数据库,我用 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

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

4

1 回答 1

1

我认为你正在寻找Cartesian ProductRutas 和 Nombres,因此在你的样本数据中给你这样的东西,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。另请注意 a 的用法,LEFT JOIN以确保您获得丢失的 0。

于 2013-05-28T17:55:16.973 回答