Сумма по максимально дате.

Добрый день.
Хочу добавить в sq_... колонку подзапроса, которая мне бы выводила сумму погашения по последней дате этого погашения. В селекте я выбираю запрос суммы, а как сказать чтобы выбиралась сумма по максимальной дате?
Спасибо.

Нравится

4 комментария

Здравствуйте Вадим!
Не до конца понял вашу задачу, приведу пример с счетами
Задача: Посчитать сумму счетов по максимальной дате оплаты.
Решение
1) Использовать конструкцию CustomSQLFilter в SelectQuery
Нам необходимо построить следующий SQL запрос

SELECT
	SUM([tbl_Invoice].[Amount]) AS [Amount]
FROM
	[dbo].[tbl_Invoice] AS [tbl_Invoice]
WHERE(PaymentDate = (SELECT TOP 1 PaymentDate FROM tbl_Invoice
ORDER BY PaymentDate DESC)   
)

Запрос

SELECT TOP 1 PaymentDate FROM tbl_Invoice
ORDER BY PaymentDate DESC

Сортирует все даты оплаты(PaymentDate) в счетах (tbl_Invoice) по убыванию, и выбирает 1ю (SELECT TOP 1)

Такое условие фильтрации можно создать, использовав конструкцию CustomSQLFilter в SelectQuery
Минус такого подхода в том, что будут проблемы с выполнением у пользователей не с правами администратора
2) Использовать подзапрос и Фильтр типа IN
Суть запроса будет также, изменения в конструкции SelectQuery
1
2
Создаем подзапрос
3
Указываем аналог TOP 1
4

Снова подключаем таблицу счетов, с нее мы будем получать только макс. дату, алиас укажем другой
5
Указываем колонку, и тип сортировки
6
Не забудьте активировать сам фильтр IN
7
В итоге, в предпросмотре, получим следующий запрос

SELECT
	SUM([tbl_Invoice].[Amount]) AS [Amount]
FROM
	[dbo].[tbl_Invoice] AS [tbl_Invoice]
WHERE([tbl_Invoice].[PaymentDate] IN 
	(SELECT TOP 1
		[tbl_InvoiceForPaymentDate].[PaymentDate] AS [PaymentDate]
	FROM
		[dbo].[tbl_Invoice] AS [tbl_InvoiceForPaymentDate]
	ORDER BY
		1 DESC))

Результат аналогичный варианту 1, без особенностей работы под пользователями без прав администратора

Сервисы двух SQ в прикрепленных файлах

Вроде все сделал как написано, но все равно ошибка.
Не правильный синтаксис около конструкции "tbl_Debt"
Не правильный синтаксис около конструкции ")"

(SELECT
[tbl_RepaymentLast].[Amount] AS [LastRepayment]
FROM
[dbo].[tbl_Repayment] AS [tbl_RepaymentLast]
WHERE([tbl_Debt].[ID] = [tbl_RepaymentLast].[DebtID] AND

(SELECT TOP 1
[tbl_RepaymentDate].[RedempDate] AS [RedempDateLast]
FROM
[dbo].[tbl_Repayment] AS [tbl_RepaymentDate]
ORDER BY
1 DESC) IN ())) AS [LastRepayment]

Вадим, не нашел таблицы tbl_RepaymentLast в базовой конфигурации,
В моем примере

SELECT
        SUM([tbl_Invoice].[Amount]) AS [Amount]
FROM
        [dbo].[tbl_Invoice] AS [tbl_Invoice]
WHERE([tbl_Invoice].[PaymentDate] IN 
        (SELECT TOP 1
                [tbl_InvoiceForPaymentDate].[PaymentDate] AS [PaymentDate]
        FROM
                [dbo].[tbl_Invoice] AS [tbl_InvoiceForPaymentDate]
        ORDER BY
                1 DESC))

Выбрать с таблицы счетов [tbl_Invoice] колонку [Amount] и сделать по ней сумму
где (where) дата оплаты (PaymentDate) в значениях:
Выбрать 1ю запись с отсортированных по убыванию дат счетов таблицы.
В итоге запросом

(SELECT TOP 1
                [tbl_InvoiceForPaymentDate].[PaymentDate] AS [PaymentDate]
        FROM
                [dbo].[tbl_Invoice] AS [tbl_InvoiceForPaymentDate]
        ORDER BY
                1 DESC)

мы получаем 1 запись а конструкция [tbl_Invoice].[PaymentDate] IN по сути является [tbl_Invoice].[PaymentDate] = той одной записи.

У вас же подзапрос:

(SELECT TOP 1
[tbl_RepaymentDate].[RedempDate] AS [RedempDateLast]
FROM
[dbo].[tbl_Repayment] AS [tbl_RepaymentDate]
ORDER BY
1 DESC) IN ())

Не привязан ни к какому полю, следовательно Вы получаете ошибку. Подгрузите сервисы с моего предыдущего сообщения и посмотрите пример, или выгрузите сервис в котором у Вас возникает ошибка

Вадим для того что бы добавить значения в сам запрос

(SELECT TOP 1
[tbl_RepaymentDate].[RedempDate] AS [RedempDateLast]
FROM
[dbo].[tbl_Repayment] AS [tbl_RepaymentDate]
ORDER BY
1 DESC) IN ())

Необходимо добавить в ветку Expression -> Expression Item
1
После чего последовать инструкциям в моем предыдущем посте, начиная с скриншота
2
Будет реализовываться подзапрос

SELECT TOP 1
                [tbl_InvoiceForPaymentDate].[PaymentDate] AS [PaymentDate]
        FROM
                [dbo].[tbl_Invoice] AS [tbl_InvoiceForPaymentDate]
        ORDER BY
                1 DESC)
Показать все комментарии