2009-09-11 3 views
4

Disons que j'ai la requête SQL suivante:SQL GROUP BY: comment le faire?

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

Ce produit les éléments suivants:

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

Et je voudrais la sortie suivante, que les groupes par années billId qui ne sont pas NULL:

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

Comment puis-je y parvenir? En passant, je ne suis pas concerné par la réunion ambiguë des résultats groupés.

Merci pour votre aide!

+0

Quelle base de données utilisez-vous? – RedFilter

+0

J'utilise MySQL – David

Répondre

8

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 

Ceci est un peu plus efficace que MIN si vous vraiment ne se soucient pas de ce que meetingID sera retourné un s longtemps qu'il appartient au bon groupe.

+0

Vous aurez besoin d'une vérification non nulle dans le groupe par les clauses – spender

+0

'@ spender': droit, merci. – Quassnoi

+0

Vous pouvez également spécifier que row_number() est SQL 2005. – Mayo

0

Vous pouvez union 2 requêtes, dont l'un fait les groupes dans les entrées non nulles, et l'autre qui obtient les null.