Вопрос

Допустим, у меня есть следующий запрос 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

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

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

Это было полезно?

Решение

В 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 будет возвращен, если он принадлежит правильной группе.

Другие советы

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top