SQL conditionnel GROUP BY: comment le faire?
Question
Disons que j'ai la requête SQL suivante:
SELECT Meeting.id AS meetingId, Bill.id AS billId
FROM Meeting
LEFT JOIN Bill ON Meeting.FK_BillId = Bill.id
Cela génère les éléments suivants:
meetingId | billId
------------------
a | NULL
b | NULL
c | 1
d | 1
e | 1
f | 2
g | 2
Et j'aimerais le résultat suivant, qui regroupe des éléments de facturation qui ne sont pas NULL:
meetingId | billId
------------------
a | NULL
b | NULL
c | 1
f | 2
Comment puis-je atteindre cet objectif? À propos, je ne suis pas concerné par la réunion ambiguë des résultats groupés.
Merci pour votre aide!
La solution
Dans 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
C'est un peu plus efficace que MIN
si vous ne vous souciez vraiment pas de ce que meetingID
sera renvoyé tant qu'il appartient au bon groupe.
Autres conseils
Vous pouvez associer 2 requêtes, l’une d’elles faisant les groupes des entrées non nulles et l’autre contenant les valeurs nulles.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow