Una descarga se compone de tiempos de descarga, id de tiempo de descarga e ID de buno. Las fallas se componen de códigos de falla, id de tiempo de descarga, estado y tipo. Una descarga puede tener muchas fallas y se puede unir en la id del tiempo de descarga.Unir a la izquierda en Postgres Valores no devueltos para nulo
Dado un conjunto de códigos de falla, los resultados deben contener cada código de falla con un conteo de fallas correspondiente. Si no se encuentra un código de falla en la descarga, el código de falla se debe devolver con un recuento de fallas de cero.
El problema parece requerir un OUTER JOIN, pero no lo he visto funcionar como se esperaba en Postgres ya que no parece devolver el conjunto con valores nulos de la tabla IZQUIERDA.
La consulta está por debajo, con algunos detalles omitidos por razones de brevedad:
SELECT f.faultcode, f.downloadtimeid, d.downloadtime, count(*) as faultcount
FROM download_time d
LEFT OUTER JOIN fs_fault f ON f.downloadtimeid = d.id
AND f.faultcode IN (1000,1100)
AND f.statusid IN(2, 4)
WHERE (d.downloadtime BETWEEN '04/11/2011' AND '05/01/2012')
AND d.bunoid = 166501
GROUP BY d.bunoid, f.downloadtimeid, d.downloadtime, f.faultcode
Al día siguiente, he editado para mostrar la respuesta. Todas las respuestas fueron cercanas y tuvieron varios elementos de asistencia. Sin embargo, la respuesta de JayC fue la más cercana. Aquí es el SQL final, con el único cambio que la cláusula WHERE de tomar la culpa de código EN declaración:
SELECT f.faultcode, f.downloadtimeid, d.downloadtime, count(*) as faultcount
FROM download_time d
RIGHT OUTER JOIN fs_fault f ON f.downloadtimeid = d.id
AND f.statusid IN(2, 4)
AND d.downloadtime BETWEEN '04/11/2011' AND '05/01/2012'
AND d.bunoid = 166501
WHERE f.faultcode IN (1000,1100)
GROUP BY d.bunoid, f.downloadtimeid, d.downloadtime, f.faultcode
Gracias, todos por su ayuda! Me encanta este sitio!
¿Ha analizado sus datos? Dudo que sea un problema dentro de PostgreSQL ... ¿Puedes proporcionar la estructura de la tabla y los datos de muestra en [SQL Fiddle] (http://sqlfiddle.com/), por favor? – vyegorov
'download_time d UNIÓN EXTERIOR IZQUIERDA fs_fault f ON f.downloadtimeid = d.id' tiene' download_time' como la tabla de la izquierda, no 'fs_fault'. La condición de unión no tiene nada que ver con qué tabla es izquierda o derecha en la unión. – JayC