SQL condizionato GROUP BY: come farlo?
Domanda
Diciamo che ho la seguente query SQL:
SELECT Meeting.id AS meetingId, Bill.id AS billId
FROM Meeting
LEFT JOIN Bill ON Meeting.FK_BillId = Bill.id
Questo genera il seguente:
meetingId | billId
------------------
a | NULL
b | NULL
c | 1
d | 1
e | 1
f | 2
g | 2
E vorrei il seguente output, che raggruppa per billId che non sono NULL:
meetingId | billId
------------------
a | NULL
b | NULL
c | 1
f | 2
Come posso raggiungerlo? A proposito, non mi preoccupa l'ambigua riunioneId dei risultati raggruppati.
Grazie per l'aiuto!
Soluzione
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
Questo è un po 'più efficiente di MIN
se non ti interessa davvero quale meetingID
verrà restituito fintanto che appartiene al gruppo giusto.
Altri suggerimenti
È possibile unire 2 query, una delle quali esegue i gruppi nelle voci non nulle e l'altra che ottiene quelle nulle.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow