全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1168
推到 Plurk!
推到 Facebook!

rownum問題

尚未結案
asou982002
一般會員


發表:14
回覆:15
積分:5
註冊:2003-06-22

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-12-22 14:03:16 IP:210.65.xxx.xxx 未訂閱
請問各位大大,如果一個table 有3個欄位(prod_no,error_name,Qty) 其中一個prod_no 會有多個 error_name ,我想取得每一個prod_no 前三名(以數量來比較) 要如何寫這段sql呢???? 謝謝!!!!
Fishman
尊榮會員


發表:120
回覆:1949
積分:2163
註冊:2006-10-28

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-12-22 14:21:39 IP:210.65.xxx.xxx 未訂閱
Hi:    請問你的 DataBase 是< >版本是多少< > -------------------------------- 小弟才疏學淺,若有謬誤請不吝指教 --------------------------------
------
Fishman
asou982002
一般會員


發表:14
回覆:15
積分:5
註冊:2003-06-22

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-12-22 15:33:55 IP:210.65.xxx.xxx 未訂閱
你好,我的DB是oracle 7.3....麻煩你了    
引言: Hi: 請問你的 DataBase 是< >版本是多少< > -------------------------------- 小弟才疏學淺,若有謬誤請不吝指教 --------------------------------
Fishman
尊榮會員


發表:120
回覆:1949
積分:2163
註冊:2006-10-28

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-12-22 16:37:35 IP:210.65.xxx.xxx 未訂閱
Hi:    
N : 粉紅色
COLUMN : 紅色
 
遞增(前面 N 筆):
SELECT  ROWNUM,
        S.SITE_USE_ID,
        S.SITE_USE_CODE,
        S.LOCATION
FROM    AR.RA_SITE_USES_ALL S,
        DUAL D
WHERE   S.LOCATION = D.DUMMY( )
AND     ROWNUM <= 20
SELECT  ROWNUM,
        A.SITE_USE_ID,
        A.SITE_USE_CODE,
        A.LOCATION
FROM    AR.RA_SITE_USES_ALL A 
WHERE   10 >   (SELECT COUNT(*) 
                FROM    AR.RA_SITE_USES_ALL B 
                WHERE   B.LOCATION < A.LOCATION)
ORDER BY
        A.LOCATION
遞減(後面 N 筆):
若欲排序之欄位為數字,可以用先前遞增方法加以修改如下: 
SELECT  ROWNUM,
        S.SITE_USE_ID,
        S.SITE_USE_CODE,
        S.LOCATION
FROM    AR.RA_SITE_USES_ALL S,
        DUAL D
WHERE   TO_CHAR(9999999999 - S.SITE_USE_ID,'FM0000000000.0000000000') = D.DUMMY( )
AND     ROWNUM <= 20
SELECT  ROWNUM,
        A.SITE_USE_ID,
        A.SITE_USE_CODE,
        A.LOCATION
FROM    AR.RA_SITE_USES_ALL A 
WHERE 10 > (SELECT COUNT(*) 
            FROM    AR.RA_SITE_USES_ALL B 
            WHERE   B.LOCATION > A.LOCATION)
ORDER BY A.LOCATION 
PS:
1.範例中階使用實體 Table,應用時可以用 SubQuery 代替使用 
2.Method 2 中,請注意 <> 的方向 
3.要在 SQL 的 SUBSELECT/SUBQUERY or VIEW 中直接使用 Order By 指令,必須將 DataBase 升級至 8.1.5.X 以後之版本(From Oracle Metalink) 
4.要在 PL/SQL 的 SUBSELECT/SUBQUERY or VIEW 中直接使用 Order By 指令,必須將 DataBase 升級至 8.1.6.X 以後之版本(From Oracle Metalink) 
以上 SQL 經測試可在 Oracle 8.0.5.1.0 上正常執行,至於 7.3 不確定是否能用,你可以先試試看,另外 SQL 方面須加以調整方可達到你所要的功能 -------------------------------- 小弟才疏學淺,若有謬誤請不吝指教 --------------------------------
------
Fishman
asou982002
一般會員


發表:14
回覆:15
積分:5
註冊:2003-06-22

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-12-22 18:13:07 IP:210.65.xxx.xxx 未訂閱
你好:       不好意思喔 我實在是才疏學淺,不太了解耶,可以請你再解釋一下嗎? 謝謝囉.....
引言: Hi:
N : 粉紅色
COLUMN : 紅色
 
遞增(前面 N 筆):
SELECT  ROWNUM,
        S.SITE_USE_ID,
        S.SITE_USE_CODE,
        S.LOCATION
FROM    AR.RA_SITE_USES_ALL S,
        DUAL D
WHERE   S.LOCATION = D.DUMMY( )
AND     ROWNUM <= 20
SELECT  ROWNUM,
        A.SITE_USE_ID,
        A.SITE_USE_CODE,
        A.LOCATION
FROM    AR.RA_SITE_USES_ALL A 
WHERE   10 >   (SELECT COUNT(*) 
                FROM    AR.RA_SITE_USES_ALL B 
                WHERE   B.LOCATION < A.LOCATION)
ORDER BY
        A.LOCATION
遞減(後面 N 筆):
若欲排序之欄位為數字,可以用先前遞增方法加以修改如下: 
SELECT  ROWNUM,
        S.SITE_USE_ID,
        S.SITE_USE_CODE,
        S.LOCATION
FROM    AR.RA_SITE_USES_ALL S,
        DUAL D
WHERE   TO_CHAR(9999999999 - S.SITE_USE_ID,'FM0000000000.0000000000') = D.DUMMY( )
AND     ROWNUM <= 20
SELECT  ROWNUM,
        A.SITE_USE_ID,
        A.SITE_USE_CODE,
        A.LOCATION
FROM    AR.RA_SITE_USES_ALL A 
WHERE 10 > (SELECT COUNT(*) 
            FROM    AR.RA_SITE_USES_ALL B 
            WHERE   B.LOCATION > A.LOCATION)
ORDER BY A.LOCATION 
PS:
1.範例中階使用實體 Table,應用時可以用 SubQuery 代替使用 
2.Method 2 中,請注意 <> 的方向 
3.要在 SQL 的 SUBSELECT/SUBQUERY or VIEW 中直接使用 Order By 指令,必須將 DataBase 升級至 8.1.5.X 以後之版本(From Oracle Metalink) 
4.要在 PL/SQL 的 SUBSELECT/SUBQUERY or VIEW 中直接使用 Order By 指令,必須將 DataBase 升級至 8.1.6.X 以後之版本(From Oracle Metalink) 
以上 SQL 經測試可在 Oracle 8.0.5.1.0 上正常執行,至於 7.3 不確定是否能用,你可以先試試看,另外 SQL 方面須加以調整方可達到你所要的功能 -------------------------------- 小弟才疏學淺,若有謬誤請不吝指教 -------------------------------- < face="Verdana, Arial, Helvetica">
Fishman
尊榮會員


發表:120
回覆:1949
積分:2163
註冊:2006-10-28

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-12-23 10:09:21 IP:210.65.xxx.xxx 未訂閱
Hi:    你先試試以下的 Query,我建了一個 Table Test1,在 Oracle 8.0.5.0.0 測試正常,若沒問題再解釋給你聽
SELECT  T.PROD_NO,
        T.ERROR_NAME,
        SUM(T.QTY)
FROM    TEST1 T
WHERE   (T.PROD_NO,T.ERROR_NAME) IN
           (SELECT  T1.PROD_NO,
                    T1.ERROR_NAME
            FROM   (SELECT  PROD_NO,
                            ERROR_NAME,
                            SUM(QTY) QTY
                    FROM    TEST1
                    GROUP BY
                            PROD_NO,
                            ERROR_NAME) T1,
                    SYS.DUAL D
            WHERE   T1.PROD_NO = T.PROD_NO
            AND     TO_CHAR(9999999999 - T1.QTY,'FM0000000000.0000000000') = D.DUMMY( )
            AND     ROWNUM <= 3)
GROUP BY
        T.PROD_NO,
        T.ERROR_NAME
ORDER BY
        T.PROD_NO,
        SUM(T.QTY) DESC
-------------------------------- 小弟才疏學淺,若有謬誤請不吝指教 --------------------------------
------
Fishman
asou982002
一般會員


發表:14
回覆:15
積分:5
註冊:2003-06-22

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-12-24 13:30:57 IP:210.65.xxx.xxx 未訂閱
你好: 7.3ok 但是有兩個問題 1.由於資料比數太多所以performance 變的有點差,這是否有辦法改善。 2. WHERE T1.PROD_NO = T.PROD_NO AND TO_CHAR(9999999999 - T1.QTY,'FM0000000000.0000000000') = D.DUMMY( ) AND ROWNUM <= 3) 為什麼要這樣寫 謝謝!!!!!!!!!!!
Fishman
尊榮會員


發表:120
回覆:1949
積分:2163
註冊:2006-10-28

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-12-24 13:58:25 IP:210.65.xxx.xxx 未訂閱
Hi:    1.在 Table 內,建一個以  Prod_NO、Error_Name 組合之 Index,應可稍微改善 Performance 問題    2.
 .....
           (SELECT  T1.PROD_NO,
                    T1.ERROR_NAME
            FROM   (SELECT  PROD_NO,
                            ERROR_NAME,
                            SUM(QTY) QTY
                    FROM    TEST1
                    GROUP BY
                            PROD_NO,
                            ERROR_NAME) T1,
                    SYS.DUAL D
            WHERE   T1.PROD_NO = T.PROD_NO
            AND     TO_CHAR(9999999999 - T1.QTY,'FM0000000000.0000000000') = D.DUMMY( )
            AND     ROWNUM <= 3)
.....
只要功能就在於取得每一個 Prod_NO 數量加總前三名之Error_Name(以數量來比較) -------------------------------- 小弟才疏學淺,若有謬誤請不吝指教 --------------------------------
------
Fishman
asou982002
一般會員


發表:14
回覆:15
積分:5
註冊:2003-06-22

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-12-24 17:51:29 IP:210.65.xxx.xxx 未訂閱
fishman大大: 感激不盡,希望以後還有機會向你請教
系統時間:2024-06-20 23:15:36
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!