SQL bedingt GROUP BY: wie es zu tun?
Frage
Lassen Sie uns sagen, dass ich die folgende SQL-Abfrage haben:
SELECT Meeting.id AS meetingId, Bill.id AS billId
FROM Meeting
LEFT JOIN Bill ON Meeting.FK_BillId = Bill.id
Das gibt folgende Möglichkeiten:
meetingId | billId
------------------
a | NULL
b | NULL
c | 1
d | 1
e | 1
f | 2
g | 2
Und ich mag die folgende Ausgabe, dass Gruppen von billId ist, die nicht NULL sind:
meetingId | billId
------------------
a | NULL
b | NULL
c | 1
f | 2
Wie kann ich das erreichen? By the way, bin ich von der zweideutigen MeetingID der gruppierten Ergebnisse nicht betroffen.
Vielen Dank für Ihre Hilfe!
Lösung
In 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
Dies ist ein wenig effizienter als MIN
wenn Sie sich wirklich egal, was meetingID
wird so lange zurückgeführt werden, wie es auf der rechten Seite Gruppe gehört.
Andere Tipps
Sie könnten Union 2 Abfragen, von denen tut die Gruppen in den Nicht-Null-Einträge, und der andere, dass die Null Einsen wird.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow