2010-12-12 62 views
0

Ma requête:groupe mysql en utilisant deux colonnes

SELECT 
tm.ManufacturerName,sum(tb.Quantity) AS qty, 
tb.AfterDiscount AS AfterDiscount 

FROM tblbasket AS tb 

INNER JOIN tblstock AS ts 
ON ts.ProductCode = tb.ProductCode 
AND tb.Status=3 

LEFT JOIN tblmanufacturer AS tm 
ON tm.ManufacturerID=ts.ManufacturerID 

GROUP BY ts.ManufacturerID,AfterDiscount 
ORDER BY qty desc 

Sorties ceci:

ManufacturerName qty AfterDiscount 
MOSER BAER HOME VIDEO 48 57.6 
MOSER BAER HOME VIDEO 39 28.8 
MOSER BAER HOME VIDEO 28 115.2 
MOSER BAER HOME VIDEO 27 259.2 
MOSER BAER HOME VIDEO 26 374.4 
SAREGAMA INDIA LIMITED 25 135 
SYMPHONY HOME VIDEO 22 36 
MOSER BAER HOME VIDEO 20 144 
SAREGAMA INDIA LIMITED 19 1282.5 
SAREGAMA INDIA LIMITED 18 67.5 
MOSER BAER HOME VIDEO 18 172.8 
MOSER BAER HOME VIDEO 16 460.8 
SYMPHONY HOME VIDEO 16 45 
RAJ VIDEO VISION 16 71.1 
MOSER BAER HOME VIDEO 15 86.4 
SAREGAMA INDIA LIMITED 15 202.5 
MASTER ACCESSORIES 13 90 
MOSER BAER HOME VIDEO 13 89.1 
MELODY RECORDING 13 31.5 
MOSER BAER HOME VIDEO 13 27 

Ce que je veux est ceci:

ManufacturerName qty AfterDiscount 
MOSER BAER HOME VIDEO 190 1568 
SAREGAMA INDIA LIMITED 77 1686 
SYMPHONY HOME VIDEO 38 81 
RAJ VIDEO VISION 16 71.1 
MASTER ACCESSORIES 13 90 
MELODY RECORDING 13 31.5 

Ma requête ne présente pas les résultats corrects . Que devrais-je changer dans ma requête?

Je suppose que je devrais additionner quantité et prix, et grouper par quantité et prix, et commander par quantité.

Une idée ou une suggestion?

Répondre

2

Supprimez le groupe AfterDiscount par. Cela vous donne une rangée unique pour toutes les combinaisons ManufacturerId, AfterDiscount qui est ce que reflète votre sortie.

Vous devez simplement GROUP BY ManufacturerID et SELECT SUM (AfterDiscount) pour remonter cette colonne et toute autre colonne qui doit être agrégée.

SELECT tm.ManufacturerName,sum(tb.Quantity) as qty,SUM(tb.AfterDiscount) as AfterDiscount from tblbasket as tb inner join tblstock as ts on ts.ProductCode = tb.ProductCode and tb.Status=3 left join tblmanufacturer as tm on tm.ManufacturerID=ts.ManufacturerID 
group by ts.ManufacturerID 
order by qty desc 
2

Vous ne serez pas le groupe par ce que vous voulez s'il y a des champs dans la requête qui ne sont pas « groupe » Plus précisément, vous devez groupe par le nom du fabricant ,, et il seul groupe pour chaque survenant uniques. .. puis ajouter les sommes/groupe pour l'autre achète le terrain .. chaque champ doit avoir soit un groupe ou sommes sur elle

0

changer cette

group by ts.ManufacturerID,AfterDiscount 

à

group by ts.ManufacturerID 
0

Vous pourriez réellement prendre une approche légèrement différente ici qui se regrouperait par les deux colonnes concaténées. Je suis tombé sur ceci où j'essayais d'utiliser un opérateur de comparaison sur une valeur calculée dans une jointure à gauche et cela ne fonctionnerait pas, donc je suis arrivé à concaténer deux colonnes et à grouper sur la valeur résultante.

SELECT 
tm.ManufacturerName,sum(tb.Quantity) AS qty, 
tb.AfterDiscount AS AfterDiscount, 
concat_ws(':', tm.ManufacturerID, tb.AfterDiscount) as ConcatManufAfterDisc 

FROM tblbasket AS tb 

INNER JOIN tblstock AS ts 
ON ts.ProductCode = tb.ProductCode 
AND tb.Status=3 

LEFT JOIN tblmanufacturer AS tm 
ON tm.ManufacturerID=ts.ManufacturerID 

GROUP BY ConcatManufAfterDisc 
ORDER BY qty desc 

Cela peut sembler une solution non idéale, mais le regroupement devrait fonctionner et c'est une solution de contournement utile.