Как сгруппировать по двум таблицам и применить агрегатные функции?

0

Схема: (оригинал)

Изображение 174551

Как применить агрегатную функцию к двум таблицам, группируя их одновременно? Я хочу таблицу группы крови и количество, которое должно быть заказано, если не удовлетворены донорами. В приведенной выше схеме запрос должен возвращать A+ 14, поскольку требование к акцептору равно 15, а донор предоставляет только 1. Все остальные группы крови удовлетворяют. Пожалуйста, предложите способ сделать это. Заранее спасибо!

  • 2
    Добро пожаловать в переполнение стека! Обратите внимание на будущее, мы предпочитаем текст над изображениями, так как мы не можем скопировать / вставить изображение, чтобы привести пример. Кроме того, изображение отображает данные, а не схему, которая будет включать определения столбцов, а не примерные данные. Но, чтобы ответить на ваш вопрос, можно связать две таблицы и получить совокупность, которую вы ищете. что ты уже испробовал? Что вы подразумеваете под "Все остальные группы крови удовлетворяют" ?
  • 0
    Привет Слоан, я хотел сказать, что для всех других групп крови сумма акцептора для конкретной группы крови соответствует и меньше суммы донора той же группы крови.
Показать ещё 1 комментарий
Теги:
database

2 ответа

0
Лучший ответ

Ты можешь использовать

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).

  • 1
    Это то, что я хотел. Спасибо за четкое объяснение!
0

Простое объединение в столбце 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    |

  • 0
    Добро пожаловать!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню