2017-02-02 5 views
0

Итак, у меня есть система, использующая MySQL для хранения, которая должна хранить пожертвования, сделанные людьми (донорами). Пожертвование вводится в систему уполномоченным пользователем. Вот создавать таблицы для всех 4-х таблиц:Отображать непревзойденные данные вместе с агрегатными функциями и несколькими объединениями

CREATE TABLE `donator` (
`DONATOR_ID` int(11) NOT NULL AUTO_INCREMENT, 
`DONATOR_NAME` varchar(50) NOT NULL, 
`STATUS` char(1) COLLATE NOT NULL DEFAULT 'A', 
PRIMARY KEY (`DONATOR_ID`) 
) 

CREATE TABLE `user` (
`USER_ID` int(11) NOT NULL AUTO_INCREMENT, 
`USERNAME` varchar(100) NOT NULL, 
`PASSWORD` varchar(200) NOT NULL, 
`TYPE` char(1) COLLATE NOT NULL, 
PRIMARY KEY (`USER_ID`) 
) 

CREATE TABLE `sif_res` (
`RES_ID` int(11) NOT NULL AUTO_INCREMENT, 
`RES_NAME` varchar(50) NOT NULL, 
`MON_VAL` double NOT NULL, 
PRIMARY KEY (`RES_ID`) 
) 

CREATE TABLE `donations` (
`DONATION_ID` int(11) NOT NULL AUTO_INCREMENT, 
`RESOURCE` int(11) NOT NULL, 
`AMOUNT` int(11) NOT NULL, 
`DONATOR` int(11) NOT NULL, 
`ENTRY_DATE` datetime NOT NULL, 
`ENTERED_BY_USER` int(11) NOT NULL, 
PRIMARY KEY (`DONATION_ID``), 
KEY `fk_resurs` (`RESOURCE``), 
KEY `fk_donator` (`DONATOR``), 
KEY `fk_user` (`ENTERED_BY_USER``), 
CONSTRAINT `fk_1` FOREIGN KEY (`DONATOR`) REFERENCES `donator` (`DONATOR_ID`) ON UPDATE CASCADE, 
CONSTRAINT `fk_2` FOREIGN KEY (`RESOURCE`) REFERENCES `sif_res` (`RES_ID`) ON UPDATE CASCADE, 
CONSTRAINT `fk_3` FOREIGN KEY (`ENTERED_BY_USER`) REFERENCES `user` (`USER_ID`) ON UPDATE CASCADE 
) 

Как вы можете видеть, у меня есть список жертвователей, пользователей и ресурсов, которые могут быть пожертвованы.

Теперь я хочу, чтобы отобразить имя всех жертвователей и их идентификаторы, однако в третьей колонке я хотел бы показать их баланс (сумма всех предметов, которые они пожертвовали) - это рассчитывается с

донорства .AMOUNT * sif_res.MON_VAL для каждого пожертвования

SQL-SELECT, которые я написал работ, однако жертвователи, не подарены ничего оставлены вне (они не совпадают по JOIN). (! С STATUS = D) я должен был бы, что он отображает все, даже если они не имеют каких-либо записей (в том случае, если их баланс может быть 0 или NULL)

Это мой SQL я написал:

SELECT DONATOR_ID 
, DONATOR_NAME 
, round(SUM(d.AMOUNT * sr.MON_VAL)) as BALANCE 
from donator c 
join donations d on c.DONATOR_ID=d.DONATOR 
join sif_res sr on sr.RES_ID=d.RESOURCE 
where c.STATUS!='D' 
group by DONATOR_ID, DONATOR_NAME 

Так что, если я выполнить следующие предложения:

INSERT INTO donator(DONATOR_NAME, STATUS) VALUES("John", 'A'); //asigns id=1 
INSERT INTO donator(DONATOR_NAME, STATUS) VALUES("Willie", 'A'); //asigns id=2 

INSERT INTO user (USERNAME, PASSWORD, TYPE) VALUES("user", "pass", 'A'); //asigns id=1 

INSERT INTO sif_res(RES_NAME, MON_VAL) VALUES("Flour", "0.5"); //asigns id=1 

INSERT INTO donations(RESOURCE, AMOUNT, DONATOR, ENTRY_DATE, ENTERED_BY_USER) VALUES(1, 100, 1, '2.2.2017', 1); 

я получить выход (с моим предложением SELECT, выше):

DONATOR_ID | DONATOR_NAME | BALANCE 
-------------------------------------------- 
1   | John   | 50 

Что я хочу получить это:

DONATOR_ID | DONATOR_NAME | BALANCE 
-------------------------------------------- 
1   | John   | 50 
2   | Willie  | 0 

Я пробовал все версии объединения (слева, справа, наружный, полный, ..), однако ни один из них не работал для меня (вероятно потому, что я использовал их неправильно)

Если бы это была просто проблема непревзойденных данных я смог бы решить эту проблему, однако агрегатную функцию SUM и другие РЕГИСТРИРУЙТЕСЬ сделать это все более сложные

ответ

0

использованием левого внешнего соединение на втором две таблиц должны сделать трюк:

SELECT c.DONATOR_ID 
, c.DONATOR_NAME 
, ifnull(round(SUM(d.AMOUNT * sr.MON_VAL)),0) as BALANCE 
from donator c 
left outer join donations d on c.DONATOR_ID=d.DONATOR 
left outer join sif_res sr on sr.RES_ID=d.RESOURCE 
where c.STATUS!='D' 
group by DONATOR_ID, DONATOR_NAME 

Я также обернул выражение BALANCE в ifnull, чтобы отобразить 0 вместо нуля.

+0

Когда я пытался использовать различные объединения, я присоединился к пожертвованиям и пожертвованиям (а не sif_res) - теперь это прекрасно работает, спасибо! –

Смежные вопросы