2013-09-01 4 views
0

J'ai une table Oracle contenant des champssql ajouter des colonnes spécifiques

id

, l'emplacement, le stock, le taux

select decode(grouping(id),1,'Total',id) id,loction, 
sum(stock) stock,avg(rate) rate from product 
group by rollup(id),location 

J'ai

 

ID Location  stock   rate 
------------------------------------------ 
A   xx   2    10 
A   xy   5    20 
Total     7    10 

B   SD   3    4 
B   RT   6    10 
Total     9    7 


C   FG   12   12 
C   GH   20   18 
Total     32   15 

**Now I want a row of Total rows where sum of stock and 
sum of rate is shown.** 

My desired output is 


ID Location  stock   rate 
------------------------------------------ 
A   xx   2    10 
A   xy   5    20 
Total     7    10 

B   SD   3    4 
B   RT   6    10 
Total     9    7 


C   FG   12   12 
C   GH   20   18 
Total     32   15 
Grand Total   48   32 

Note: Notez n'est pas moyen mais la somme du taux moyen des lignes totales.

Répondre

0

Vous pouvez utiliser UNION pour ajouter le total:

select decode(grouping(id),1,'Total',id) id,loction, 
sum(stock) stock,avg(rate) rate from product 
group by rollup(id),location 
UNION 
select 'Grand Total','',sum(stock) stock,sum(rate) rate 
from product 

Si vous ne mélangez pas différents agrégats que vous pourriez obtenir un grand total avec ROLLUP ou avec des ensembles de regroupement, mais je ne pense pas que vous pouvez obtenir un total général SUM() avec AVG() sous-totaux.

+0

oui cela résoudra mon problème, mais y at-il une autre solution. – rishi

0

Peut être comme ceci:

select decode(grouping(id),1,'Total',id) id,loction, 
sum(stock) stock,avg(rate) rate from product 
group by rollup(id),location 
union 
select sum(stock), sum(rate) from 
(
select decode(grouping(id),1,'Total',id) id,loction, 
sum(stock) stock,avg(rate) rate from product 
group by rollup(id),location 
) where id='Total' group by id; 
+0

Mais il donnera seulement la dernière ligne. Je veux la production complète selon ma question. – rishi

+0

Mais la valeur totale Grand est égale à la somme des valeurs totales dans votre question –

+0

oui, je veux mettre toutes les lignes, total et grand valeur totale à travers un sql. – rishi

0

Faire un rollup sur toutes les colonnes produira le grand total:

select (case when grouping(id) = 1 then 'Total' else id end) as id, loction, 
     sum(stock) stock,avg(rate) rate 
from product 
group by rollup(id, location) 

Cependant, vous ne voulez pas le correctif cumulatif sur location. Donc, vous pouvez filtrer cela avec une clause having:

select (case when grouping(id) = 1 then 'Total' else id end) as id, loction, 
     sum(stock) stock, avg(rate) rate 
from product 
group by rollup(id, location) 
having not (grouping(product.location) = 1 and grouping(product.id) = 0); 
+0

'ROLLUP' semble conserver le type agrégé, donc le Grand Total serait le' AVG() 'de toutes les valeurs' rate', pas le 'SUM()' de le 'AVG()' qu'il est après. Mon interprétation de la question était que OP voulait la somme des moyennes subtotales, comme un total général, dont je ne suis pas sûr comment vous feriez cela en oracle. –

+0

@GoatCO. . . L'exemple de données suggère la moyenne plutôt que la somme, basée sur deux des trois groupes. –

+0

Le total général (32) semble être une somme des sous-totaux, qui sont des moyennes de leurs groupes (sauf pour le premier groupe). –

Questions connexes