SQL условно GROUP BY: как это сделать? - PullRequest
4 голосов
/ 11 сентября 2009

Допустим, у меня есть следующий запрос SQL:

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

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

Спасибо за вашу помощь!

Ответы [ 2 ]

8 голосов
/ 11 сентября 2009

В 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 голосов
/ 11 сентября 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...