2017-09-04 36 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那么你会愚蠢的使用'其他'经纪人! –