SQL condicional GROUP BY: ¿cómo hacerlo?
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!
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