Oracle SQL - установить ноль при повторяющихся значениях - PullRequest
0 голосов
/ 05 октября 2018

Пожалуйста, помогите с нижеприведенным запросом Oracle SQL:

Пробовал несколько способов, но не получил ожидаемых результатов.

Набор данных:

ORDER_NO    ITEM CODE
1234      999999    777
1234      999999    111
1234      999999    777
1234      999999    111

Ожидаемый результат:

ORDER_NO    ITEM     CODE
1234      999999      777
                      111

Ответы [ 2 ]

0 голосов
/ 05 октября 2018

Поскольку вы отметили это для SQL Developer (который в этом контексте можно назвать слоем приложения / представления), вы можете использовать break ... nodup:

clear breaks
break on order_no nodup on item nodup

with your_table (order_no, item, code) as (
  select 1234, 999999, 777 from dual
  union all select 1234, 999999, 111 from dual
  union all select 1234, 999999, 777 from dual
  union all select 1234, 999999, 111 from dual
)
select * from your_table;

  ORDER_NO       ITEM       CODE
---------- ---------- ----------
      1234     999999        777
                             111
                             777
                             111

С несколькимизаказы и предметы:

with your_table (order_no, item, code) as (
  select 1234, 999999, 777 from dual
  union all select 1234, 999999, 111 from dual
  union all select 1234, 999999, 777 from dual
  union all select 1234, 999999, 111 from dual
  union all select 1235, 999999, 111 from dual
  union all select 1236, 999999, 111 from dual
  union all select 1236, 999998, 111 from dual
  union all select 1236, 999998, 111 from dual
)
select * from your_table;

  ORDER_NO       ITEM       CODE
---------- ---------- ----------
      1234     999999        777
                             111
                             777
                             111
      1235     999999        111
      1236     999999        111
      1236     999998        111
                             111
0 голосов
/ 05 октября 2018

Вы можете попытаться создать номер строки с помощью ROW_NUMBER оконной функции в CTE, затем используйте CASE WHEN, чтобы сделать это.

CREATE TABLE T(
   ORDER_NO INT,
   ITEM INT,
   CODE INT
);


INSERT INTO T VALUES (1234,999999,777);
INSERT INTO T VALUES (1234,999999,111);
INSERT INTO T VALUES (1234,999999,777);
INSERT INTO T VALUES (1234,999999,111);

Запрос 1 :

with cteRn as (
  SELECT t1.*,ROW_NUMBER() OVER (PARTITION BY ORDER_NO,ITEM,CODE order by ORDER_NO) rn 
  FROM T t1
), cteGrp as (
  SELECT
       t1.*,ROW_NUMBER() OVER (PARTITION BY ORDER_NO,ITEM ORDER BY CODE desc) grp
  FROM cteRn t1
  WHERE rn = 1
)

SELECT  
     (CASE WHEN grp = 1 then ORDER_NO end) ORDER_NO,
     (CASE WHEN grp = 1 then ITEM end)  ITEM,
     CODE 
FROM cteGrp

Результаты :

| ORDER_NO |   ITEM | CODE |
|----------|--------|------|
|     1234 | 999999 |  777 |
|   (null) | (null) |  111 |
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...