Oracle SQL-将重复值设置为null

Oracle SQL-将重复值设置为null,sql,oracle,Sql,Oracle,请帮助执行以下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 您

请帮助执行以下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

您可以尝试通过
CTE
中的
row\u number
窗口函数生成行号,然后在生成行号时使用
CASE

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 |

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 |

您可以尝试通过
CTE
中的
row\u number
窗口函数生成行号,然后在
生成行号时使用
CASE

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 |

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 |

当您为SQL Developer(在本上下文中可能被认为是应用程序/表示层)标记该层时,您可以使用:

具有多个订单和项目:

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

当您为SQL Developer(在本上下文中可能被认为是应用程序/表示层)标记该层时,您可以使用:

具有多个订单和项目:

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

请展示您所尝试的内容。您可以解释此要求背后的逻辑吗?@Aleksej这是一个非常常见的报告要求。许多老式的报告工具都支持它。这里有一个类似的问题,你真的应该在应用层而不是在数据库中这样做。@Gary_W-我正在学习-如果你帮不上忙,那没关系。请展示你的尝试。你能解释一下这个要求背后的逻辑吗?@Aleksej这是一个非常常见的报告要求。许多老式的报告工具都支持它。这里有一个类似的问题,你真的应该在应用层而不是在数据库中这样做。@Gary_W-我在学习-如果你帮不上忙,那没关系。