2015-07-23 4 views
0

У меня есть база данных с двумя таблицами: - Кредит, который записывает все платежи, которые я должен получить - Оплату, которая регистрирует платежи, которые я получилSQL - Фильтр результата запроса с дополнительным условием

В Структура Кредит: id, всего Оплата: ID, полученный

Моя цель - получить запрос, который распечатает все платежи, которые еще не полностью оплачены. На данный момент я написал запрос, который успешно печатает - идентификатор кредита - общая сумма денег - сумма полученных денег Мне просто нужно добавить условие: не печатайте записи, в которых платеж полностью выполнен. Это мой SQL-код:

SELECT Credit.id, 
     Credit.total, 
     (SELECT SUM(Payment.received) 
     FROM Payment WHERE Payment.id = Credit.id) AS TotalReceived 
FROM Credit 
WHERE Credit.total > 0; 

Я попытался изменить последнюю строку с «WHERE Credit.total> TotalReceived», но он не работает.

Можете ли вы мне помочь? :)

PS. В кредите идентификатор уникален, тогда как в таблице «Оплата» может присутствовать множество строк с одинаковым идентификатором.

+0

использовать соединения и стараться избегать связанных друг с другом внутренних запросов. – manoj

ответ

0

это должно предоставить вам кредитные листы, которые не были оплачены. ваша таблица платежей должна, вероятно, иметь поле creditId, к которому нужно присоединиться, а не по адресу Credit.id = Payment.id, но если это так, то это будет работать.

SELECT c.id, 
     c.total, 
     SUM(Nz(p.received,0)) AS totalreceived 
FROM Credit c 
     LEFT JOIN Payment p ON c.id = p.id --not sure about this? 
WHERE c.total > 0 
GROUP BY c.id, c.total 
HAVING c.total > SUM(Nz(p.received,0)) 
+0

Почти: я редактировал вашу JOIN в LEFT JOIN, но, однако, я не вижу строку Credit, для которой нет никого Запись платежа. – pittuzzo

+0

сделали левую помощь присоединиться? – JamieD77

+0

@pittuzzo .. с нулями вам нужно объединить нуль в 0, чтобы сумма работала .. попробуйте обновление – JamieD77

3

Вы не можете добавить предложение WHERE для агрегированного столбца, если вы не используете SubQueries. Вы должны использовать комбинацию GROUP BY и HAVING

Ваш запрос можно переписать так (я предпочитаю эту структуру с помощью JOIN, а не использовать запрос сотрудничества, связанные, как вы использовали.

SELECT Credit.id, Sum (Credit.total), SUM(Payment.received) TotalReceived 
FROM Credit 
INNER JOIN Payment ON Payment.id = Credit.id 
WHERE Credit.total > 0 
GROUP BY Credit.id 

сейчас добавьте HAVING пункт

SELECT Credit.id, Sum (Credit.total), SUM(Payment.received) TotalReceived 
FROM Credit 
INNER JOIN Payment ON Payment.id = Credit.id 
WHERE Credit.total > 0 
GROUP BY Credit.id 
HAVING SUM(Payment.received) > 0 

Если вы абсолютно хотите сохранить структуру, использовать подзапрос как этот

Select Id, Total, TotalReceived 
From 
(
    SELECT Credit.id, Credit.total, (SELECT SUM(Payment.received) 
    FROM Payment WHERE Payment.id = Credit.id) AS TotalReceived 
    FROM Credit 
    WHERE Credit.total > 0 
) DerivedTable 
Where TotalReceived > 0 
+0

Ну, я попробовал код, который я написал с помощью INNER JOIN, но ACCESS дает мне такие ошибки: «Вы не можете выполнить запрос, который не включает термин« id », указанный как часть агрегатной функции». У меня было то же самое с вашим кодом ... Однако я думаю, что ваш код не делает ничего, что мне нужно :) – pittuzzo

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