Pregunta

Supongamos que tengo la siguiente consulta SQL:

SELECT Meeting.id AS meetingId, Bill.id AS billId
FROM Meeting 
LEFT JOIN Bill ON Meeting.FK_BillId = Bill.id

Eso produce lo siguiente:

meetingId | billId
------------------
     a    |  NULL
     b    |  NULL
     c    |     1
     d    |     1
     e    |     1
     f    |     2
     g    |     2

Y me gustaría la siguiente salida, que agrupa por billId's que no son NULL:

meetingId | billId
------------------
     a    |  NULL
     b    |  NULL
     c    |     1
     f    |     2

¿Cómo puedo lograr eso? Por cierto, no me preocupa la reunión ambigua de los resultados agrupados.

¡Gracias por tu ayuda!

¿Fue útil?

Solución

En SQL Server :

SELECT  meetingId, billid
FROM    (
        SELECT  ROW_NUMBER() OVER (PARTITION BY billId ORDER BY meetingID) AS rn,
                m.*
        FROM    mytable m
        ) q
WHERE   rn = 1 OR billid IS NULL

ANSI :

SELECT  MIN(meetingId), billid
FROM    mytable
WHERE   billid IS NOT NULL
GROUP BY
        billId
UNION ALL
SELECT  meetingId, billId
FROM    mytable
WHERE   billid IS NULL

MySQL :

SELECT  meetingId, billid
FROM    mytable
WHERE   billid IS NOT NULL
GROUP BY
        billId
UNION ALL
SELECT  meetingId, billId
FROM    mytable
WHERE   billid IS NULL

Esto es un poco más eficiente que MIN si realmente no te importa lo que meetingID se devolverá siempre que pertenezca al grupo correcto.

Otros consejos

Podrías unir 2 consultas, una de las cuales incluye los grupos en las entradas que no son nulas y la otra que obtiene las nulas.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top