2015-10-15 106 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);