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!

Était-ce utile?

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
scroll top