2011-06-15 32 views
0

我們有中有三列的表:PL/SQL - 甲骨文9i中 - 用手轉動

Customer_name, Age_range, Number_of_people. 
1    1-5   10 
1    5-10  15 

我們需要回到在不同年齡段的人都數作爲一個單一的查詢行。如果我們搜索客戶#1,查詢應該只返回一行:

Header- Age Range (1-5)    Age Range (5-10) 
     10        15 

我們需要在一行中獲得所有結果;當我查詢客戶1時,結果應該僅爲age_range中單個行組中的人數。

什麼是最好的方法來解決這個問題?

+0

請注意每個答案如何包含具有不同輸出的查詢?這是因爲這個問題非常模糊。您對@Ryan Bates的回答所作的評論應納入問題中,您應該嘗試澄清您在此嘗試做的究竟是什麼。 – Allan 2011-06-15 18:59:29

+0

更新了它,謝謝 – sandy 2011-06-15 19:13:15

回答

2

您需要手動執行樞軸與CUSTOMER_NAME和的ename更換DEPTNO:

SELECT SUM(CASE WHEN age_range = '5-10' 
        THEN number_of_people 
        ELSE NULL END) AS nop5, 
      SUM(CASE WHEN age_range = '10-15' 
        THEN number_of_people 
        ELSE NULL END) AS nop10 
    FROM customers 
    WHERE customer_name = 1; 
+0

我只是想的是愚蠢的總和:)。非常感謝 – sandy 2011-06-15 19:16:53

0

只是做

select Number_of_people 
from table 
where Customer_name = 1 

我們是否丟失了一些細節?

+0

啊我想我沒有正確解釋它。我需要在一行中獲得所有結果,例如當我查詢客戶1時,結果應該是age_range的單個行組中的所有人數 – sandy 2011-06-15 17:50:52

+0

好了,那麼您可以從表group_by中選擇Age_Range,Number_of_people Age_Range'。這將返回多行。你需要簡化爲單行嗎? – Ryan 2011-06-15 17:55:31

+0

是的,我只需要返回一行,只有列的所有人數值。 – sandy 2011-06-15 17:57:42

2

使用LISTGAGG,COLLECT或9i之後添加的其他功能,可以輕鬆實現10g和11g的解決方案,但我相信以下內容將適用於9i。
源(http://www.williamrobertson.net/documents/one-row.html

你只需要NUMBER_OF_PEOPLE

SELECT deptno, 
     LTRIM(SYS_CONNECT_BY_PATH(ename,',')) 
FROM (SELECT deptno, 
       ename, 
       ROW_NUMBER() OVER (PARTITION BY deptno ORDER BY ename) -1 AS seq 
     FROM emp) 
WHERE connect_by_isleaf = 1 
CONNECT BY seq = PRIOR seq +1 AND deptno = PRIOR deptno 
START WITH seq = 1; 


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

3 rows selected. 
+0

Thx男人,上面的解決方案給了我正確的方向 – sandy 2011-06-15 19:17:58

1

這將創建一個存儲FUNCTION這意味着您可以隨時訪問它。

CREATE OR REPLACE FUNCTION number_of_people(p_customer_name VARCHAR2) 
RETURN VARCHAR2 
IS 
    v_number_of_people NUMBER; 
    v_result VARCHAR2(500); 

    CURSOR c1 
    IS 
    SELECT Number_of_people FROM the_table WHERE Customer_name = p_customer_name; 
BEGIN 
    OPEN c1; 
    LOOP 
    FETCH c1 INTO v_number_of_people; 
    EXIT WHEN c1%NOTFOUND; 

    v_result := v_result || v_number_of_people || ' ' || CHR(13); 
    END; 
END; 

要運行它,使用:

SELECT number_of_people(1) INTO dual;

希望這會有所幫助,並請讓我知道,如果有任何錯誤,我沒有testrun功能自己。