Проблема написания запроса в sql и реализации его в отчете Webi

Я пытаюсь выполнить запрос в sql, чтобы получить только записи агентов, связанных с несколькими описаниями.

Пример: Имя таблицы: АГЕНТ

AGENCY_ID   PRODUCT_DESC  AGENT number
100            ABC        2000
101            ABC        2001
101            XYZ        2002
102            XYZ        2003

AGENCY_ID 101 имеет описания ABC и XYZ. Из таблицы я хочу получить только записи из пересекающегося агентства.

В приведенном выше случае я хочу тянуть только:

AGENCY_ID   PRODUCT_DESC  AGENT number
101         ABC           2001
101         XYZ           2002

Я также пытаюсь выполнить это в фильтрах запросов отчетов webi бизнес-объектов.

Посоветуйте, пожалуйста, как добраться до решения моего вопроса.

Заранее спасибо!


person Vindhya Giri    schedule 03.05.2018    source источник
comment
Предоставьте образцы данных, код, который вы пробовали, схемы таблиц и ожидаемые результаты.   -  person Daniel Marcus    schedule 03.05.2018
comment
Отметьте СУБД (MySQL, SQL Server и т. д.), которую вы используете.   -  person Yogesh Sharma    schedule 03.05.2018


Ответы (3)


В SQL вы можете использовать subquery

select t.*
from table t
where exists (select 1 from table  where AGENCY_ID = t.AGENCY_ID and PRODUCT_DESC <> t.PRODUCT_DESC);

Большинство СУБД не работают с <>, поэтому на всякий случай используйте !=.

person Yogesh Sharma    schedule 03.05.2018

Один из способов

DECLARE @tblActivity AS TABLE (AGENCY_ID INT , PRODUCT_DESC VARCHAR(100), AGENTnumber INT)
INSERT INTO @tblActivity (Agency_id,Product_Desc,AGentNumber)
VALUES
(100,'ABC', 2000),
(101,'ABC', 2001),
(101,'XYZ', 2002),
(102,'XYZ', 2003)

SELECT tmp.*
FROM @tblActivity tmp 
INNER JOIN @tblActivity tmp1 ON tmp1.AGENCY_ID = tmp.AGENCY_ID
                      AND tmp1.AGENTnumber != tmp.AGENTnumber
                      AND tmp1.PRODUCT_DESC != tmp.PRODUCT_DESC
person Rajat Jaiswal    schedule 03.05.2018

В качестве альтернативы, если ваша СУБД поддерживает оконные/аналитические функции; можно получить количество повторяющихся идентификаторов агентов, а затем использовать это количество в качестве фильтра.

Пример: cte здесь просто для настройки данных в базе данных Hana, поэтому я использую from dummy, чтобы получить производную таблицу с именем CTE.

Затем мы используем эту производную таблицу в подзапросе с аналитикой count(), чтобы получить количество записей по Agency_ID, а затем мы показываем все такие записи, где количество> 1

Подзапрос/встроенное представление необходимо, так как нам нужно, чтобы результат CNT был сгенерирован, прежде чем мы сможем ограничить его; и нельзя использовать аналитическую/оконную функцию в предложении с/где.

With CTE (AGENCY_ID,PRODUCT_DESC,AGENT_number) AS (
SELECT 100,            'ABC',        2000 from dummy union all
SELECT 101,            'ABC',        2001 from dummy union all
SELECT 101,            'XYZ',        2002 from dummy union all
SELECT 102,            'XYZ',        2003 from dummy)

SELECT B.* 
FROM (SELECT *, count(*) over (partition by Agency_ID) cnt 
      FROM CTE) B
WHERE cnt > 1
person xQbert    schedule 27.07.2018