2017-03-28 3 views
0

EDIT - Je travaille dans XAMPPErreur # 1111 - Utilisation incorrecte de la fonction de groupe

Je fais un devoir pour l'école, et c'est la base de données que je me donne:

customers(customerName, city, customerNumber)

orders(customerNumber, orderNumber)

orderdetails(orderNumber, priceEach, quantityOrdered)

et je suis en train d'interroger le nom du client qui a placé le bi ggest l'ordre par la valeur totale (priceEach * quantityOrdered), et c'est une exigence pour moi d'utiliser au moins une requête imbriquée.

Voici ce que je crois devrait être la bonne réponse:

SELECT customername 
FROM orderdetails 
INNER JOIN orders 
on orderdetails.orderNumber = orders.orderNumber 
INNER JOIN customers 
on orders.customerNumber = customers.customerNumber 
WHERE sum(priceEach*quantityOrdered) = (SELECT 
    max(sum(priceEach*quantityOrdered)) 
    FROM orderdetails 
    INNER JOIN orders 
    on orderdetails.orderNumber = orders.orderNumber 
    INNER JOIN customers 
    on orders.customerNumber = customers.customerNumber 
    GROUP by orderdetails.orderNumber) 
GROUP by orderdetails.orderNumber 
ORDER by sum(priceEach*quantityOrdered) DESC 

Cependant, quand je rentre, je reçois une erreur « # 1111 - Utilisation incorrecte de la fonction de groupe » et je ne peux pas pour la vie de moi comprendre pourquoi. Merci

EDIT - même lorsque je supprime toutes les lignes GROUP BY et ORDER BY de la requête, je reçois toujours la même erreur. I pense il a à voir avec moi en appelant «max» et «somme» dans la requête imbriquée SELECT mais je ne suis pas totalement sûr. Lors de l'utilisation de GROUP BY, tous les champs dans SELECT doivent être dans une fonction d'agrégat ou inclus dans la clause GROUP BY

+0

du groupe extérieur par le champ devrait être également sélectionnez – maSTAShuFu

+0

exigence Silly, parce que ce n'est pas la meilleure façon d'écrire la requête. –

+0

ce sera un bon début .. vérifier les erreurs puis en vérifiant la logique pour le résultat souhaité: D – maSTAShuFu

Répondre

0

Que diriez-vous ceci:

SELECT customername, SUM(orderTotal) 
FROM customers 
INNER JOIN (SELECT priceEach*quantityOrdered AS orderTotal, customers.customerNumber AS customerNumber 
      FROM orderdetails 
      INNER JOIN orders 
      ON orderdetails.orderNumber = orders.orderNumber 
      INNER JOIN customers ON orders.customerNumber = customers.customerNumber) sub 
      ON sub.customerNumber = customers.customerNumber 
GROUP by customername 
ORDER by SUM(orderTotal) DESC 
+1

merci d'avoir fait de mon commentaire une réponse. – maSTAShuFu

+0

Votre commentaire ne le dit pas du tout. nom_personnel qu'il sélectionne doit être dans une fonction d'agrégat ou inclus dans la clause GROUP BY. –

+0

Salut - merci pour cela, mais même lorsque je supprime toutes les lignes GROUP BY et ORDER BY de la requête, je reçois toujours la même erreur. Je * pense * que cela a à voir avec moi appelant 'max' et 'sum' dans la requête imbriquée SELECT mais je ne suis pas totalement sûr. –

0

try this ...

et il est une exigence pour moi d'utiliser au moins une requête imbriquée. Le cross apply obtiendra le maximum de ventes avec le numéro de client pour revenir à la requête principale.

ventes devraient être regroupés par customerNumber

SELECT 
    customername, y.TotalSales 
FROM customers a 
cross apply 
(
select top 1 x.TotalSales,x.customerNumber from 
(SELECT 
    SUM(priceEach * quantityOrdered) [TotalSales], c.customerNumber 
FROM orderdetails 
INNER JOIN orders 
    ON orderdetails.orderNumber = orders.orderNumber 
INNER JOIN customers c 
    ON orders.customerNumber = c.customerNumber 
GROUP BY c.customerNumber) 
) x order by x.totalSales desc 
) y on y.customerNumber = a.customerNumber 

ou pour max au niveau de l'ordre, le groupe par customerNumber, numéro de commande

SELECT 
    customername, y.totalsales, y.ordernumber 
FROM customers a 
cross apply 
(
select top 1 x.TotalSales,x.customerNumber,x.ordernumber from 
(SELECT 
    SUM(priceEach * quantityOrdered) [TotalSales], c.customerNumber,ordernumber 
FROM orderdetails 
INNER JOIN orders 
    ON orderdetails.orderNumber = orders.orderNumber 
INNER JOIN customers c 
    ON orders.customerNumber = c.customerNumber 
GROUP BY c.customerNumber,ordernumber) 
) x order by x.totalSales desc 
) y on y.customerNumber = a.customerNumber