2017-09-04 43 views
1

我有下面的代碼,通過NetTotal返回前5: -前5和其他甲骨文

SELECT 
    * 
    FROM (SELECT 
     b.BROKERAGE_NAME, 
     SUM(s.STATEMENT_NET) AS NetTotal 
    FROM TBLSTATEMENTSNEW s 
    LEFT JOIN TBLBROKERAGESNEW b 
     ON s.BROKERAGE_ID = b.ID 
    WHERE s.STATEMENT_DATE BETWEEN To_date('01-AUG-2017') AND To_date('05-AUG-2017') 
    GROUP BY b.BROKERAGE_NAME 
    ORDER BY NetTotal DESC) st 
WHERE rownum <= 5 
ORDER BY rownum; 

是否可以歸納爲第六行非TOP5 NetTotals,用的BROKERAGE_NAME 「其他」?

我想輸出是: -

BROKERAGE_NAME NetTotal 
-------------- -------- 
Bro1     222 
Bro2     333 
Bro3     444 
Bro4     555 
Bro5     666 
Other   3143514 
+0

你能添加一個期望的輸出嗎? –

回答

2

使用子查詢保條款重新使用已生成的命令查詢:

WITH totals AS (
    SELECT ROWNUM AS rn, 
     t.* 
    FROM (
    SELECT b.BROKERAGE_NAME, 
      SUM(s.STATEMENT_NET) AS NetTotal 
    FROM TBLSTATEMENTSNEW s 
      LEFT JOIN TBLBROKERAGESNEW b 
      ON s.BROKERAGE_ID = b.ID 
    WHERE s.STATEMENT_DATE BETWEEN DATE '2017-08-01' AND DATE '2017-08-05' 
    GROUP BY b.BROKERAGE_NAME 
    ORDER BY NetTotal DESC 
) t 
) 
SELECT BROKERAGE_NAME, 
     NetTotal 
FROM totals 
WHERE rn <= 5 
UNION ALL 
SELECT 'Other', 
     SUM(NetTotal) 
FROM totals 
WHERE rn > 5; 
1

這裏有一個選擇:

SELECT CASE WHEN rn <= 5 THEN rn 
      ELSE 6 
     END row_num, 
     CASE WHEN rn <= 5 THEN brokerage_name 
      ELSE 'Other' 
     END brokerage_name, 
     SUM(nettotal) AS nettotal 
FROM (SELECT b.brokerage_name, 
      SUM(s.statement_net) AS nettotal, 
       row_number() OVER (ORDER BY SUM(s.statement_net) DESC) rn 
     FROM tblstatementsnew s 
       LEFT JOIN tblbrokeragesnew b ON s.brokerage_id = b.id 
     WHERE s.statement_date BETWEEN to_date('01-AUG-2017', 'dd-MON-yyyy') AND to_date('05-AUG-2017', 'dd-MON-yyyy') 
     GROUP BY b.brokerage_name 
     ORDER BY nettotal DESC) st 
GROUP BY CASE WHEN rn <= 5 THEN rn 
       ELSE 6 
     END row_num, 
     CASE WHEN rn <= 5 THEN brokerage_name 
       ELSE 'Other' 
     END; 

您應該測試每個解決方案以查看哪一個最適合您的數據。

0

您可以使用解析row_number()功能:如果你需要應付不太可能(但有可能)情況下的券商之一,會被稱爲「其他」,那麼這會照顧

SELECT case when rn <= 5 then BROKERAGE_NAME else 'Other' end 
    , sum(NetTotal) 
    FROM (SELECT BROKERAGE_NAME, NetTotal, row_number() over (order by NetTotal DESC) rn 
      FROM (SELECT b.BROKERAGE_NAME 
        , SUM(s.STATEMENT_NET) AS NetTotal 
        FROM TBLSTATEMENTSNEW s 
         LEFT JOIN TBLBROKERAGESNEW b 
           ON s.BROKERAGE_ID = b.ID 
       WHERE s.STATEMENT_DATE BETWEEN To_date('01-AUG-2017') AND To_date('05-AUG-2017') 
       GROUP BY b.BROKERAGE_NAME 
       ) 
     ) 
group by case when rn <= 5 then BROKERAGE_NAME else 'Other' end 
ORDER BY min(case when rn <= 5 then rn else 6 end); 

即:

SELECT BROKERAGE_NAME, NetTotal 
    FROM (SELECT case when rn <= 5 then BROKERAGE_NAME else 'Other' end BROKERAGE_NAME 
      , case when rn <= 5 then rn else 6 end as rn2 
      , sum(NetTotal) NetTotal 
      FROM (SELECT BROKERAGE_NAME, NetTotal, row_number() over (order by NetTotal DESC) rn 
        FROM (SELECT b.BROKERAGE_NAME 
          , SUM(s.STATEMENT_NET) AS NetTotal 
          FROM TBLSTATEMENTSNEW s 
           LEFT JOIN TBLBROKERAGESNEW b 
            ON s.BROKERAGE_ID = b.ID 
         WHERE s.STATEMENT_DATE BETWEEN To_date('01-AUG-2017') AND To_date('05-AUG-2017') 
         GROUP BY b.BROKERAGE_NAME 
         ) 
       ) 
      group by case when rn <= 5 then BROKERAGE_NAME else 'Other' end BROKERAGE_NAME 
       , case when rn <= 5 then rn else 6 end as rn2 
      ORDER BY rn2); 
+1

如果您的經紀商名稱爲「其他」,會發生什麼情況? – MT0

+0

@ MT0那麼你會愚蠢的使用'其他'經紀人! –