2015-10-15 65 views
0

下面的要求,就可以帮助我获得所需的查询..Oracle查询空值

create table sales(Order_ID number, item varchar2(20)); 

insert into sales values (10, 'RICE'); 
insert into sales values (10, 'WATER'); 
insert into sales values (10, 'SALT'); 
insert into sales values (20, 'TOMATO'); 
insert into sales values (20, 'ONION'); 
insert into sales values (30, 'OIL'); 
insert into sales values (30, 'EGG'); 
insert into sales values (40, 'CHICKEN'); 
insert into sales values (50, 'FISH'); 

我需要输出如下格式。

Order_ID ITEM 
10   RICE 
      WATER 
      SALT 
20   TOMATO 
      ONION 
30   OIL 
      EGG 
40   CHICKEN 
50   FISH 
+0

这是MySQL或Oracle数据库吗?此外,什么决定了每个order_id中项目的显示顺序? – Boneist

+0

它在oracle数据库中是需要的。订单可以是任何东西。不需要特定的顺序。 –

+0

如果是Oracle数据库,请不要将问题标记为MySQL。 – Boneist

回答

2

使用row_number()解析函数加上一个case语句,以仅填充了第一行的order_id:

select case when rn = 1 then order_id end order_id, 
     item 
from (select order_id, 
       item, 
       row_number() over (partition by order_id order by item) rn 
     from sales); 

    ORDER_ID ITEM     
---------- -------------------- 
     10 RICE     
      SALT     
      WATER    
     20 ONION    
      TOMATO    
     30 EGG     
      OIL     
     40 CHICKEN    
     50 FISH  
1

使用下面的查询邻所需UR/P

select case when rno=1 
    then 
    order_id 
    else 
    null 
    end 
    as order_id,item 
    from 
    (
    select order_id,item, row_number() over (partition by order_id order by order_id) rno from sales 
    ) 
2

我通常在SQL * Plus,它全部是关于格式化您的输出

您可以使用BREAK ON column_name

例如,

SQL> break on deptno 
SQL> SELECT deptno, ename FROM emp order by deptno; 

    DEPTNO ENAME 
---------- ---------- 
     10 CLARK 
      KING 
      MILLER 
     20 JONES 
      FORD 
      ADAMS 
      SMITH 
      SCOTT 
     30 WARD 
      TURNER 
      ALLEN 
      JAMES 
      BLAKE 
      MARTIN 

14 rows selected. 

大多数的基于GUI的客户端工具现在支持大多数SQL*Plus命令的。例如,在SQL Developer中,您可以作为脚本运行,即F5。在PL/SQL Developer中,SQL * Plus环境有一个不同的窗口。但是,如果你想要纯SQL方法,我建议@ Boneist的解决方案。

+0

Lalit,这个查询可以在蛤蟆上使用? –

+0

是的,它的确如此。如果你知道如何使用工具。我使用SQL * Plus。对于任何基于GUI的工作,我使用SQL Developer。两者都是免费的。 https://community.oracle.com/thread/1004607?start=0&tstart=0 AFAIK,TOAD,PL/SQL Developer,SQL Developer都具有“作为脚本运行”功能。 –

+0

感谢您的信息。我想用相同输出的子程序生成一个报告。可以在子程序中使用你的代码吗? –

1

使用LAG(列)OVER(ORDER BY)

LAG(列)获取此前的纪录。

SELECT DECODE(ORDER_ID, PRE_ORDER_ID, null, ORDER_ID) AS ORDER_ID, 
     ITEM 
    FROM 
    (SELECT ORDER_ID, 
      LAG(ORDER_ID) over 
       (order by ORDER_ID) AS PRE_ORDER_ID, 
      ITEM 
     FROM SALES);