Sql подзапрос с суммой - PullRequest
       6

Sql подзапрос с суммой

2 голосов
/ 07 февраля 2010

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

SELECT Invoice.[Invoice Date], Invoice.Item, Invoice.Quantity, 
    Invoice.[Unit Price], 
    Invoice.[Payment Status], Invoice.[LongDate], 
    Invoice.Quantity*Invoice.[Unit Price] - Sum(Q.Amount) AS Remaining
FROM  
    (SELECT Invoice.[Invoice Id], [Payment ID]
       FROM Invoice 
       INNER JOIN Payment ON Invoice.[Invoice Id] = Payment.[Invoice Id]) AS Q
    INNER JOIN Invoice ON Q.[Invoice Id] = Invoice.[Invoice Id]
GROUP BY Invoice.[Invoice Id]; 

Ответы [ 2 ]

3 голосов
/ 07 февраля 2010

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

SELECT
    Invoice.[Invoice Id],
    Invoice.Quantity * Invoice.[Unit Price] - COALESCE(Amount, 0) AS Remaining
FROM Invoice
LEFT JOIN (
    SELECT [Invoice Id], SUM(Amount) AS Amount
    FROM Payment
    GROUP BY [Invoice Id]
) T1
ON Invoice.[Invoice Id] = T1.[Invoice Id]

Конечно, вам также нужно будет добавить и другие столбцы в выборку, но я не думаю, что они имеют отношение к этому вопросу, поэтому я для ясности опустил их.

Вот некоторые тестовые данные, которые я использовал, чтобы проверить это:

CREATE TABLE Invoice ([Invoice Id] INT NOT NULL, Quantity INT NOT NULL, [Unit Price] INT NOT NULL);
INSERT INTO Invoice ([Invoice Id], Quantity, [Unit Price]) VALUES
(1, 10, 5),
(2, 20, 10),
(3, 1, 1);

CREATE TABLE Payment ([Invoice Id] INT NOT NULL, Amount INT NOT NULL);
INSERT INTO Payment ([Invoice Id], Amount) VALUES
(1, 10),
(2, 100),
(2, 15);

И результат с этими данными:

Id  Remaining
1   40
2   85
3   1
1 голос
/ 07 февраля 2010
SELECT Invoice.[Invoice ID], 
    Sum(Invoice.Quantity * Invoice.[Unit Price]) 
    - COALESCE(Sum(Payment.Amount), 0) AS Remaining
FROM
    Invoice LEFT JOIN Payment ON Invoice.[Invoice ID] = Payment.[Invoice ID]
GROUP BY Invoice.[Invoice ID]

РЕДАКТИРОВАТЬ: я предполагаю, вам не понадобится информация, связанная с элементом в результате.
LEFT JOIN используется при условии, что в счете-фактуре может отсутствовать запись о платеже.

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