Организация фильтра "IN" в подзапросе

Добрый день.

Подскажите, как организовать в запросе условие типа "IN".
Я готовлю отчет, одно из полей которых должно показать количество контрагентов, у которых есть звонки с определенными результатами. Набор этих результатов фиксирован.
Я не совсем понял, где мне указать значения этих результатов

Нравится

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

Алексей, а в чем сложность? Создаете параметры и в них пишите Ваши значения. В IN-фильтре добавляете элементы и указываете Ваши параметры.

так вот я и не понял, как мне добавить туда элементы. В моем случае - это несколько IDшников.

Здравствуйте Алексей,
К примеру, хотим сделать такой Select в Администраторе который бы выводил всех контактов с типом "Контактное лицо" и "Клиент"

Данному запросу в SQL Server соответствует запрос

select * from tbl_Contact
where 
ContactTypeID in ('{3D51B409-B691-4F77-9723-359C65399AB4}','{75277E61-09B4-4D7E-BD9D-FA7F8E90476B}')

Где
3D51B409-B691-4F77-9723-359C65399AB4 - Тип контакта "Контактное лицо "
75277E61-09B4-4D7E-BD9D-FA7F8E90476B - "Клиент"

Сделаем аналогичный сервис в Terrasoft Администраторе

Создаем сервис SelectQuery
Задаем таблицу From
from

Выбираем колонку для отображения, к примеру поле Name

Далее в блок Where добавляем Include фильтр
Include
Указываем к какому полю применять Include фильтр
filtername

Далее добавляем параметры

param

Указываем значения параметров
expr1

expr2

Код в предпросмотре сервиса

SELECT
	[tbl_Contact].[Name] AS [Name]
FROM
	[dbo].[tbl_Contact] AS [tbl_Contact]
WHERE([tbl_Contact].[ContactTypeID] IN (:Expr2, :Expr1))

XML сервиса прикрепил к посту.

Разобрался. Я должен был насоздавать параметров, а в условии добавить Expression'ов
snimok

Всем спасибо за помощь.

Алексей, не создал дополнительного скриншота, финальный sq выглядит так

tree

expr1

expr2

"Яворский Алексей" написал:
не создал дополнительного скриншота, финальный sq выглядит так

Это уже я додумал сам (комм #4).
В любом случаи Вы со Станиславом направили меня в нужное русло. У меня всё получилось. Еще раз спасибо.

Подсажите, а если нужно в In включить select, то как быть?
Использовала CustomSQLFilter с таким текстом:

OpportunityID in (select ID from [tbl_Opportunity] where CustomerID = :ID)

В итоге в карточке значение отображается верно, а в реестре нет. В техподдержке мне ответили следующее:
"У Вас идет отображение этого поля только для текущего ID. То есть, в карточке ID записи есть, и для него данные выводятся. В реестре же ID мы не получаем, поэтому и отображаются нули. Вам следует переделать Custom SQL filter."

Но как его переписать я понять не могу. Порекомендовали обратить внимание на эту тему, но что-то тоже не помогает... :(

Вам надо запрос переделать на EXISTS :

EXISTS (SELECT ID FROM [tbl_Opportunity] WHERE ID = OpportunityID  AND  CustomerID = :ID)

и использовать соответствующий тип фильтра в сервисе запроса

Не совсем понятно здесь условие "WHERE ID = OpportunityID" что под ним подрузамевается? Мы же выбираем как раз ID из таблицы Opportunity...
у меня получился вот такое поле:

	(SELECT
		SUM([tbl_Payment].[PaySumm]) AS [PaySumm]
	FROM
		[dbo].[tbl_Payment] AS [tbl_Payment]
	WHERE([tbl_Payment].[Payed] = :True AND
		EXISTS 
		(SELECT
			[tbl_Opportunity1].[ID] AS [ID]
		FROM
			[dbo].[tbl_Opportunity] AS [tbl_Opportunity1]
		WHERE([tbl_Opportunity1].[ID] = [tbl_Opportunity].[ID] AND
			:ID = [tbl_Opportunity1].[CustomerID])))) AS [PayedSumm]

но картина не изменилась: в карточке отображается все верно, а в реестре - нули

Не, немного не так. Вы проверяете вхождение OpportunityID в определенный диапазон, соответственно, EXISTS так же должен быть завязан на OpportunityID.
Более понятным станет изменение условия, если Вы пришлете исходный запрос (или подзапрос) в котором фигурирует данное условие, полностью.

Изначально я сделала так:

	(SELECT
		SUM([tbl_Payment].[PaySumm]) AS [PaySumm]
	FROM
		[dbo].[tbl_Payment] AS [tbl_Payment]
	WHERE([tbl_Payment].[Payed] = :True AND
		OpportunityID in (select ID from [tbl_Opportunity] where CustomerID = :ID))) AS [PayedSumm],
	[tbl_Account].[PayedSummConst] AS [PayedSummConst]

А теперь совсем запуталась :)

Если я правильно понял, OpportunityID - это поле таблицы [tbl_Payment], тогда запрос будет таким

  (SELECT
                SUM([tbl_Payment].[PaySumm]) AS [PaySumm]
        FROM
                [dbo].[tbl_Payment] AS [tbl_Payment]
        WHERE([tbl_Payment].[Payed] = :True AND
                EXISTS (SELECT ID FROM [tbl_Opportunity] WHERE ID = [tbl_Payment].OpportunityID  AND  CustomerID = :ID)
)) AS [PayedSumm], ...

Сделала так, та же картина :)

Минуточку, а :ID это у Вас что? Я правильно понимаю, что это ID записи, карточку которой Вы открываете? Тогда того, чтобы запрос работал для каждой записи в реестре, Вам надо его переделать по такой схеме

SELECT 
  [ВашаТаблица].ID, 
  ...
  (SELECT
                SUM([tbl_Payment].[PaySumm]) AS [PaySumm]
        FROM
                [dbo].[tbl_Payment] AS [tbl_Payment]
        WHERE([tbl_Payment].[Payed] = :True AND
                EXISTS (SELECT ID FROM [tbl_Opportunity] WHERE ID = [tbl_Payment].OpportunityID  AND  CustomerID = [ВашаТаблица].ID)
)) AS [PayedSumm]
FROM [ВашаТаблица].ID
WHERE 
[ВашаТаблица].ID = :ID

Если будет не понятно, тогда пришлите полностью весь запрос :).

Алексей, но ведь фильтр

[ВашаТаблица].ID = :ID

по умолчанию выключен, разве нет?
Суть я, кажется, поняла (хотя, возможно, я ошибаюсь), сделала так:

(SELECT
		SUM([tbl_Payment].[PaySumm]) AS [PaySumm]
	FROM
		[dbo].[tbl_Payment] AS [tbl_Payment]
	WHERE([tbl_Payment].[Payed] = :True AND
		EXISTS 
		(SELECT
			[tbl_Opportunity].[ID] AS [ID]
		FROM
			[dbo].[tbl_Opportunity] AS [tbl_Opportunity]
		WHERE([tbl_Opportunity].[ID] = [tbl_Payment].[OpportunityID] AND
			[tbl_Account].[ID] = [tbl_Opportunity].[CustomerID])))) AS [PayedSumm]

проблема осталась

Странно. Это может не работать, если :ID, который вы указывали в изначальной конструкции, не соответствует [tbl_Account].[ID], в остальных случаях, условия вроде как эквивалентны.

Попробуйте ваш CustomSQLFilter

OpportunityID IN (SELECT ID FROM [tbl_Opportunity] WHERE CustomerID = [tbl_Account].[ID])

Если и это не сработает, то скорее всего мы по разному понимаем проблему. Понадобится полный текст запроса :)

Вложила файл с текстом запроса из предпросмотра.
Сделала так, как Вы рекомендуете - проблема осталась. В карточке поле рассчитывается, в реестре нули

Здравствуйте Алена
Запрос в SQL Server Management Studio выдает верные суммы, для каждого контрагента ?

Алена, судя по всему, Вам надо получить сумму платежей, который выполнил контрагент по своим счетам.
Я думаю, лучше вообще сделать вот так

[tbl_Account].[Birthday] AS [Birthday],
(
SELECT
		SUM([tbl_Payment].[PaySumm]) AS [PaySumm]
	FROM
		[dbo].[tbl_Payment] AS [tbl_Payment]
		INNER JOIN [dbo].[tbl_Opportunity] as [tbl_Opportunity] ON [tbl_Opportunity].ID = [tbl_Payment].[OpportunityID ]
	WHERE [tbl_Opportunity].CustomerID = [tbl_Account].[ID]
) AS [PayedSumm],

Алексей, да, Management Studio отображает все верно.
Алексей, Вы не поверите, даже так не работает!

Алена, проверьте данное поле в датасете, обратите внимание на галочку "Поле для отображения"
1

1. А ту колонку вытянули? Может есть похожая?
2. Посмотрите у колонки DataField.
3. Права доступа на поле не настраивали?

Видимо, проблема была в том, что не было галочки "Поле для отображения". Спасибо всем большое! Теперь в реестре все корректно!
Но, вообще-то странно, потому что я думала, что если этой галочки нет, то поля в реестре вообще не будет... А так оно было, но с нулями...

Теперь у Вас есть три варианта всё-таки правильных запросов :) . Можете сами поисследовать, но в теории, последний - самый быстрый.

Показать все комментарии