Добрый день.
Хочу добавить в sq_... колонку подзапроса, которая мне бы выводила сумму погашения по последней дате этого погашения. В селекте я выбираю запрос суммы, а как сказать чтобы выбиралась сумма по максимальной дате?
Спасибо.
Нравится
Здравствуйте Вадим!
Не до конца понял вашу задачу, приведу пример с счетами
Задача: Посчитать сумму счетов по максимальной дате оплаты.
Решение
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
Создаем подзапрос
Указываем аналог TOP 1
Снова подключаем таблицу счетов, с нее мы будем получать только макс. дату, алиас укажем другой
Указываем колонку, и тип сортировки
Не забудьте активировать сам фильтр IN
В итоге, в предпросмотре, получим следующий запрос
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
После чего последовать инструкциям в моем предыдущем посте, начиная с скриншота
Будет реализовываться подзапрос
SELECT TOP 1 [tbl_InvoiceForPaymentDate].[PaymentDate] AS [PaymentDate] FROM [dbo].[tbl_Invoice] AS [tbl_InvoiceForPaymentDate] ORDER BY 1 DESC)