Проблема написания запроса в SQL и реализации его в отчете Webi - PullRequest
0 голосов
/ 03 мая 2018

Я пытаюсь выполнить запрос в 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

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

Посоветуйте мне, пожалуйста, решение моей проблемы.

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

Ответы [ 3 ]

0 голосов
/ 03 мая 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
0 голосов
/ 28 июля 2018

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

Пример: cte здесь просто для настройки данных в базе данных Hana, поэтому я использую 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
0 голосов
/ 03 мая 2018

В 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);

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

...