2016-06-07 5 views
0

Ich habe eine Tabelle namens "Produkte", wo es 100 Datensätze mit Verkaufsdetails hat. Meine Anforderung ist so einfach, dass ich es nicht konnte.pgsql -Zeigt Top 10 Produkte die Verkäufe und andere Produkte als "andere" und seine Summe der Verkäufe

Ich muss die Top-10-Produktnamen mit Umsatz und andere Produktnamen als "andere" und seine Verkäufe zeigen. so total wird mein o/p 11 reihen sein. 11. Reihe sollte andere und Summe der Verkäufe aller restlichen Produkte sein. Kann mir jemand die Logik geben?

O/p so sein sollte,

 Name   sales 
    ------   ----- 
1 colgate  9000 
2 pepsodent  8000 
3 closeup  7000 
4 brittal  6000 
5 ariies   5000 
6 babool   4000 
7 imami   3000 
8 nepolop  2500 
9 lactoteeth  2000 
10 menwhite  1500 
11 Others   6000 (sum of sales of remaining 90 products) 

hier ist meine SQL-Abfrage,

select case when rank<11 then prod_cat else 'Others' END as prod_cat, 
total_sales,ID,rank from (select ROW_NUMBER() over (order by (sum(i.grandtotal)) desc) as rank,pc.name as prod_cat,sum(i.grandtotal) as total_sales, pc.m_product_category_id as ID`enter code here` 
from adempiere.c_invoice i join adempiere.c_invoiceline il on il.c_invoice_id=i.c_invoice_id join adempiere.m_product p on p.m_product_id=il.m_product_id join adempiere.m_product_category pc on pc.m_product_category_id=p.m_product_category_id 
where extract(year from i.dateacct)=extract(year from now()) 
group by pc.m_product_category_id) innersql 
order by total_sales desc 

o/p, was i bekam,

prod_cat total_sales  id   rank 
-------- -----------  ---   ---- 
BSHIRT  4511697.63  460000015  1 
BT-SHIRT 2725167.03  460000016  2 
SHIRT  2630471.56  1000003  3 
BJEAN  1793514.07  460000005  4 
JEAN  1115402.90  1000004  5 
GT-SHIRT 1079596.33  460000062  6 
T SHIRT  446238.60  1000006  7 
PANT  405189.00  1000005  8 
GDRESS  396789.02  460000059  9 
BTROUSER 393739.48  460000017 10 
Others  164849.41  1000009  11 
Others  156677.00  1000008  12 
Others  146678.00  1000007  13 
+1

So können Sie herausfinden, wie Sie die ersten 10 Zeilen erhalten? – Strawberry

+0

Ja, ich kann die ersten 10 Zeilen herausfinden, indem ich die Verkäufe aufsteigend absteigend –

+0

Ich denke, das könnte helfen: [link] (http://stackoverflow.com/questions/26420797/tsql-select-top-10-display-the-rest (as-other) – OferP

Antwort

0

Als @ e4c5 empfiehlt, UNION zu verwenden:

select id, prod_cat, sum(total_sales) as total_sales 
with 
    totals as (
    select --pc.m_product_category_id as id, 
      pc.name as prod_cat, 
      sum(i.grandtotal) as total_sales, 
      ROW_NUMBER() over (order by sum(i.grandtotal) desc) as rank 
    from adempiere.c_invoice i 
    join adempiere.c_invoiceline il on (il.c_invoice_id=i.c_invoice_id) 
    join adempiere.m_product p on (p.m_product_id=il.m_product_id) 
    join adempiere.m_product_category pc on (pc.m_product_category_id=p.m_product_category_id) 
    where i.dateacct >= date_trunc('year', now()) and i.dateacct < date_trunc('year', now()) + interval '1' year 
    group by pc.m_product_category_id, pc.name 
    ), 
    rankedothers as (
    select prod_cat, total_sales, rank 
    from totals where rank <= 10 
    union 
    select 'Others', sum(total_sales), 11 
    from totals where rank > 10 
    ) 
select prod_cat, total_sales 
from ranked_others 
order by rank 

Auch ich empfehle sargable Bedingungen wie die oben genannten, die etwas komplizierter ist als die, die Sie implementiert haben, aber im Allgemeinen den zusätzlichen Aufwand wert.

+0

danke für Ihre Unterstützung. Ich habe meine Anforderung, aber immer noch muss ich die "anderen" als letzten Datensatz anstelle von Mitte bekommen ... ist das möglich? –

+0

@AbdurRahmaan fertig :) –

Verwandte Themen