Как сгруппировать по двум таблицам и применить агрегатные функции? - PullRequest
0 голосов
/ 12 апреля 2019

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

enter image description here

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

Ответы [ 2 ]

0 голосов
/ 12 апреля 2019

Простое объединение в столбце 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 голосов
/ 12 апреля 2019

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

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 ing -SUM(total) вместо SUM(total).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...