Схема: (оригинал)
Как применить агрегатную функцию к двум таблицам, группируя их одновременно? Я хочу таблицу группы крови и количество, которое должно быть заказано, если не удовлетворены донорами. В приведенной выше схеме запрос должен возвращать A+ 14, поскольку требование к акцептору равно 15, а донор предоставляет только 1. Все остальные группы крови удовлетворяют. Пожалуйста, предложите способ сделать это. Заранее спасибо!
Ты можешь использовать
SELECT bg, SUM(total)
FROM
(
(SELECT bg, SUM(amount) AS total FROM Donor GROUP BY bg) UNION
(SELECT bg, -SUM(amount) AS total FROM Acceptor GROUP BY bg)
) a
GROUP BY bg
HAVING SUM(total) < 0;
Это даст вам (A+, -14) обозначение дефицита 14 для группы A+.
Это работает, сначала суммируя доступные группы крови в доноре, затем беря отрицательную сумму доступных групп крови в акцепторе, затем снова складывая все это.
Вы можете получить все результаты, удалив HAVING
условие, или вы можете получить результат, который вы запрошенную первоначально SELECT
, Инг -SUM(total)
вместо SUM(total)
.
Простое объединение в столбце BG с группировкой в то же время покажет результаты, которые вы ищете
СОЗДАТЬ ПРИМЕРНЫЕ ТАБЛИЦЫ
create table 'donor' (
'did' int(10) ,
'name' varchar(30),
'gender' varchar(1),
'city' varchar(30),
'bg' varchar(4),
'amount' int(10)
);
create table 'acceptor' (
'did' int(10),
'name' varchar(30),
'gender' varchar(1),
'city' varchar(30),
'bg' varchar(4),
'amount' int(10)
);
ДОБАВИТЬ ПРИМЕР ДАННЫХ
insert into 'donor'
('name','gender','city','bg','amount')
VALUES
('MARIA','F','Warne,NH','AB+',7),
('RUBY','F','East Natchitoche, PA','AB+',3),
('CHARLES','M','East Natchitoche, PA','A-',6),
('DOROTHY','F','East Natchitoche, PA','AB+',9),
('MICHAEL','M','Warne,NH','A+',1);
insert into 'acceptor'
('name','gender','city','bg','amount')
VALUES
('LINDA','F','Warne,NH','A+',9),
('CHARLES','M','Warne,NH','AB+',8),
('RICHARD','M','East Natchitoche, PA','AB+',3),
('LINDA','F','East Natchitoche, PA','A+',1),
('PATRICIA','F','Warne,NH','A+',5);
ПРИМЕР ЗАПРОСА:
select
a.'bg',
sum(a.'amount') as 'num donor units',
sum(b.'amount') as 'num acceptor units'
from 'donor' a
join 'acceptor' b
on a.'bg' = b.'bg'
GROUP BY a.'bg';
РЕЗУЛЬТАТЫ
| bg | num donor units | num acceptor units |
| --- | --------------- | ------------------ |
| A+ | 3 | 15 |
| AB+ | 38 | 33 |
Еще один запрос, который создает отчет о заказе:
select
a.'bg',
sum(a.'amount') as 'num donor units',
sum(b.'amount') as 'num acceptor units',
if(sum(a.'amount') < sum(b.'amount'),
CONCAT('Order ',sum(b.'amount') - sum(a.'amount'),' Units'),
'None Needed') as 'Ordering'
from 'donor' a
join 'acceptor' b
on a.'bg' = b.'bg'
GROUP BY a.'bg';
Результаты
| bg | num donor units | num acceptor units | Ordering |
| --- | --------------- | ------------------ | -------------- |
| A+ | 3 | 15 | Order 12 Units |
| AB+ | 38 | 33 | None Needed |