2017-03-17 1 views
0

Ich habe eine SQL-Abfrage, die so geht:SQL berechnen Prozentsatz der Spaltenwerte basierend auf den Namen

SELECT name, SUM(weight) weight, product FROM table GROUP BY name, product; 

Welche Ausgabe wie das gibt mir:

|name   weight  product | 
    |custA  100  trash | 
    |custA  300  recycling| 
    |custB  50   trash | 
    |custB  450  recycling| 

Jetzt habe ich den Prozentsatz berechnen wollen Gewicht basierend auf dem Namen, aber immer noch nach Produkt getrennt. Anstatt also würde die Ausgabe wie folgt aussehen:

|name   weight  product | 
    |custA  .25  trash | 
    |custA  .75  recycling| 
    |custB  .10  trash | 
    |custB  .90  recycling| 

Gibt es eine Möglichkeit, dies mit einer normalen SQL-Abfrage ausführen können?

Antwort

1

Mit CTE und correlated subquery

WITH TotalWeight(name, product, weightsum) AS 
(
    SELECT name, product, sum([weight]) as weightsum 
    FROM custdetails 
    GROUP BY name, product 
) 

SELECT name, product, weightsum, (0.0+weightsum)/(select sum([weight]) from custdetails where name = T.name) as percentage 
FROM TotalWeight T; 

Dies ergibt folgendes Ergebnis:

name product  weightsum percentage 
custA recycling 300  0.750000000000 
custA trash  100  0.250000000000 
custB recycling 450  0.900000000000 
custB trash  50  0.100000000000 
+0

Funktioniert super. Vielen Dank. –

0

versuchen, etwas wie folgt aus:

select a.name, a.weight/b.weight, a.product 
from (
    select name, sum(weight) as weight, product 
    from table 
    group by name, product 
) as a 
inner join (
    select name, sum(weight) as weight 
    from table 
    group by name 
) as b 
on (a.name = b.name) 
0

Try this:

SELECT table.name, SUM(weight)/custWeightTable.custWeght as weight ,  product FROM table , (SELECT name, SUM (weight) as custWeight FROM table GROUP BY name) custWeightTable WHERE table.name = custWeightTable.name GROUP BY table.name, table.product; 
0

Sie können dies mit Fensterfunktionen tun:

SELECT name, product, SUM(weight) as weight, 
     SUM(weight)/SUM(SUM(weight)) OVER (PARTITION BY name) as ratio 
FROM table 
GROUP BY name, product; 

Beachten Sie, dass einige Datenbanken Integer-Division tun. Also, wenn das Gewicht eine ganze Zahl ist, müssen Sie in eine Dezimalzahl von irgendeiner Art konvertieren:

SELECT name, product, SUM(weight) as weight, 
     SUM(weight)/SUM(1.0*SUM(weight)) OVER (PARTITION BY name) as ratio 
FROM table 
GROUP BY name, product; 
Verwandte Themen