SQL: получение общих долей клиента через несколько таблиц

#sql #database #postgresql #select

#sql #База данных #postgresql #выберите

Вопрос:

У меня есть 3 таблицы customer (cid, имя, телефон) и transactions (cid (ссылка), fundid, дата, акции) и fund (fundid, fund_name).

Я пытаюсь написать sql-запрос, который даст мне общее количество акций для каждого клиента для каждого фонда.

Вот примеры вставок:

 INSERT INTO CUSTOMER(1, 'Alex', '123456678');

INSERT INTO CUSTOMER(2, 'Bill', '6323450236');

INSERT INTO CUSTOMER(3, 'Marie', '8568289912');



INSERT INTO FUND (1, 'Docotel');

INSERT INTO FUND (2, 'Armen');

INSERT INTO FUND (3, 'TD');




INSERT INTO TRANSACTIONS(1, 2, '2010-2-12', 234); (means shares bought)

INSERT INTO TRANSACTIONS(3, 1, '2010-4-2', 192);

INSERT INTO TRANSACTIONS(1, 2, '2010-4-22', -45); (the '-' means shares sold) 

INSERT INTO TRANSACTIONS(1, 3, '2010-4-26', 220);

INSERT INTO TRANSACTIONS(3, 2, '2010-7-21', 170);
  

Я хочу, чтобы результат sql выглядел примерно так:

 Name| Fund_Name | Total_Shares |

Alex Docotel 189

Alex TD 220

Marie Docotel 192

Marie Armen 170
  

Спасибо

Ответ №1:

Попробуйте это:

 SELECT customer.name, fund.fund_name, T1.total_shares
FROM
(
    SELECT cid, fundid, SUM(shares) AS total_shares
    FROM transactions
    GROUP BY cid, fundid
) T1
JOIN customer ON T1.cid = customer.cid
JOIN fund ON T1.fundid = fund.fundid
ORDER BY customer.name
  

Комментарии:

1. Будет ли это учитывать результат покупки и продажи акций? Я имею в виду, приведет ли это к покупке акций Docotel Алекса — продаже акций Docotel Алекса?

2. Да, я думаю, делает то, что вы хотите.

3. Спасибо .. это сработало как шарм: D .. Мне просто нужно было добавить sum (T1.total_shares), чтобы получить желаемые результаты.