2009-09-11 2 views
4

Допустим, у меня есть следующий SQL-запрос:SQL условный GROUP BY: как это сделать?

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

Это выводит следующее:

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

И я хотел бы следующий вывод, что группы по billId-х, которые не являются NULL:

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

Как я могу это достичь? Кстати, меня не волнует неоднозначная встреча сгруппированными результатами.

Благодарим за помощь!

+0

В чем вы работаете? – RedFilter

+0

Я использую MySQL – David

ответ

8

В 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 

Это пустяк более эффективным, чем MIN, если вы действительно не заботятся о том, что meetingID будет возвращено если он принадлежит к правой группе.

+0

Вам нужна нулевая проверка в группе по статьям – spender

+0

'@ spender': справа, спасибо. – Quassnoi

+0

Возможно, вы также захотите указать, что row_number() - это SQL 2005. – Mayo

0

Вы можете объединить 2 запроса, один из которых содержит группы в ненулевых записях, а другой - нулевые.