usar una obtener numero filas ejemplos consulta como comandos avg sql oracle join count left-join

sql - una - Contando el número de filas unidas en la combinación izquierda



sum count sql (2)

Qué tal algo como esto:

SELECT m.MESSAGEID, sum((case when mp.messageid is not null then 1 else 0 end)) FROM MESSAGE m LEFT JOIN MESSAGEPART mp ON mp.MESSAGEID = m.MESSAGEID GROUP BY m.MESSAGEID;

La función COUNT () contará cada fila, incluso si tiene un valor nulo. Usando SUM () y CASE, puede contar solo valores no nulos.

EDITAR: Una versión más simple tomada del comentario superior:

SELECT m.MESSAGEID, COUNT(mp.MESSAGEID) FROM MESSAGE m LEFT JOIN MESSAGEPART mp ON mp.MESSAGEID = m.MESSAGEID GROUP BY m.MESSAGEID;

Espero que ayude.

Estoy intentando escribir una consulta agregada en SQL que devuelve el recuento de todos los registros unidos a un registro determinado en una tabla; Si no se unieron registros al registro dado, entonces el resultado para ese registro debería ser 0 :

Datos

Mi base de datos tiene este aspecto (desafortunadamente, no puedo cambiar la estructura):

MESSAGE ---------------------------------------------- MESSAGEID SENDER SUBJECT ---------------------------------------------- 1 Tim Rabbit of Caerbannog 2 Bridgekeeper Bridge of Death MESSAGEPART ---------------------------------------------- MESSAGEID PARTNO CONTENT ---------------------------------------------- 1 0 (BLOB) 1 1 (BLOB) 3 0 (BLOB)

( MESSAGEPART tiene una PRIMARY KEY("MESSAGEID", "PARTNO") compuesta PRIMARY KEY("MESSAGEID", "PARTNO") )

Salida deseada

Teniendo en cuenta los datos anteriores, debería obtener algo como esto:

MESSAGEID COUNT(*) ----------------------------------------------- 1 2 2 0

Parece obvio que necesito hacer una combinación a la izquierda en la tabla MESSAGE , pero ¿cómo devuelvo un conteo de 0 para las filas donde las columnas unidas de MESSAGEPART son NULL ? He intentado lo siguiente:

Lógica

He intentado

SELECT m.MESSAGEID, COUNT(*) FROM MESSAGE m LEFT JOIN MESSAGEPART mp ON mp.MESSAGEID = m.MESSAGEID GROUP BY m.MESSAGEID;

Sin embargo, esto devuelve

MESSAGEID COUNT(*) ----------------------------------------------- 1 2 2 1

También he intentado

SELECT mp.MESSAGEID, COUNT(*) FROM MESSAGE m LEFT JOIN MESSAGEPART mp ON mp.MESSAGEID = m.MESSAGEID GROUP BY mp.MESSAGEID;

pero esto vuelve

MESSAGEID COUNT(*) ----------------------------------------------- 1 2 1

¿Qué estoy haciendo mal aquí?


Primero debes contar en tu tabla de mensajes de texto antes de unirte, creo. Prueba esto:

SELECT m.MessageId , COALESCE(c, 0) as myCount FROM MESSAGE m LEFT JOIN (SELECT MESSAGEID , count(*) c FROM MESSAGEPART GROUP BY MESSAGEID) mp ON mp.MESSAGEID = m.MESSAGEID