SQL condicional GROUP BY: como fazê-lo?
Pergunta
Vamos dizer que eu tenho a seguinte consulta SQL:
SELECT Meeting.id AS meetingId, Bill.id AS billId
FROM Meeting
LEFT JOIN Bill ON Meeting.FK_BillId = Bill.id
que gera o seguinte:
meetingId | billId
------------------
a | NULL
b | NULL
c | 1
d | 1
e | 1
f | 2
g | 2
E eu gostaria o seguinte resultado, que os grupos de billId de que não são NULL:
meetingId | billId
------------------
a | NULL
b | NULL
c | 1
f | 2
Como posso conseguir isso? By the way, eu não estou preocupado com a meetingId ambígua dos resultados agrupados.
Obrigado por sua ajuda!
Solução
Em 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
Este é um pouco mais eficiente do que MIN
se você realmente não se preocupam com o que meetingID
será devolvido, desde que ele pertence ao grupo certo.
Outras dicas
Você poderia união 2 consultas, um dos quais faz os grupos nas entradas não nulas, e outro que recebe os nulos.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow