0
votes

J'essaie de construire une requête et de ne pas sûre là où se trouve le problème?

J'ai écrit la requête SQL ci-dessous pour rejoindre quatre tables et effectuer les calculs en fonction de critères mais jette une erreur. Appréciera toute aide. Merci

​​Je ne sais pas où je fais mal ou si ma logique n'est pas correcte? P>

SELECT C.cust_name,
       R.Reg_name,
       sum(CASE WHEN P.Class = 'R' THEN T.Amount*.1 WHEN P.Class = 'P' THEN T.Amount*.2 ELSE T.Amount*.1 END) AS Calc_Amount
FROM Customers C,
     Regions R,
     transactions T,
     customer_class P
WHERE C.reg_id = R.reg_id, C.cust_id = T.cust_id, C.cust_id = P.cust_id
  AND P.class_id, P.class IN (SELECT max(class_id), class
                              FROM customer_class
                              GROUP BY cust_id)
  AND T.Time, T.Amount IN (SELECT max(time),
                                   Amount
                            FROM transactions
                            GROUP BY cust_id)
GROUP BY C.cust_name
ORDER BY C.cust_name

sql

2 commentaires

S'il vous plaît apprendre à utiliser la syntaxe de jointure moderne. En dehors de cela, le problème semble être que vous êtes séparé de votre situation, ils doivent être séparés par et ou. Vous avez également une condition à moitié étrange, et p.class_id qui semble manquer la deuxième partie


@Joakimdanielson - La partie avec p.class_id, p.cclass semble être ... (p.class_id, p.cclass) dans (sélectionnez max (class_id), classe. .. . Idito et également T.Time, t.Amount doit être entre parenthèses.


3 Réponses :


1
votes

Vous ne pouvez pas combiner plusieurs conditions avec un , dans la clause WHERE. Vous voulez probablement un et là: xxx

mais je vous recommande vivement de passer à une jointure explicite dans la clause de FRO ( xxx

En outre, lorsque vous souhaitez utiliser plusieurs colonnes avec un opérateur, vous devez enfermer les colonnes du côté gauche avec des parenthèses, par exemple (p.class_id, p.cclass) au lieu de p.class_id, p.cclass .

Vous devez également inclure toutes les colonnes qui ne sont pas utilisées dans une agrégation dans le groupe clause .

La requête complète devrait donc ressembler à quelque chose comme suit: xxx


7 commentaires

Merci pour vos commentaires. Je reçois maintenant une erreur "Pas un groupe d'expression".


Vous devez inclure r.reg_name dans le groupe par


J'ai ajouté groupe par (C.Cust_name, r.reg_name); à la fin mais avoir la même erreur. Une idée?


@Uttamdas: Ne mettez pas les colonnes entre parenthèses


Je me demande simplement si le problème est dans le groupe par clause dans la déclaration suivante?


Ce n'est pas "dans" l'article. C'est après la clause WHERE


Class_id Cust_id Classe 1 1 20/03/2018 R 2 1 03/04/2018 R 3 1 05/04/2018 P 4 2 01/04/2018 P 5 2 04/04/2018 P 6 3 01/04 / 2018 R - J'aimerais atteindre Max (Class_id) (dernière heure?) Par Cust_Id, mais aussi besoin de prendre la colonne de quantité - qui est dans ma sous-requête.



0
votes

Je recommanderais correctement joindre syntaxe et à l'aide des fonctions de la fenêtre. Je pense que vous voulez quelque chose comme ceci: xxx

Cependant, je ne suis pas sûr que cette logique utilise quelque chose d'utile. Vous devriez probablement demander à une nouvelle question avec des données d'échantillonnage et des résultats souhaités.


0 commentaires

0
votes

bâtiment sur @ a_horse_with_no_name's Réponse - Le problème est avec le groupe par code> expressions dans les sous-requêtes de la clause WHERE. On dirait que vous devriez utiliser

SELECT C.cust_name,
       R.Reg_name,
       sum(CASE WHEN P.Class = 'R' THEN T.Amount*.1 WHEN P.Class = 'P' THEN T.Amount*.2 ELSE T.Amount*.1 END) AS Calc_Amount
FROM Customers C 
  JOIN Regions R ON C.reg_id = R.reg_id
  JOIN transactions T ON C.cust_id = T.cust_id
  JOIN customer_class P ON C.cust_id = P.cust_id
WHERE (P.class_id, P.class) IN (SELECT max(class_id), class
                                FROM customer_class
                                GROUP BY class)
  AND (T.cust_id, T.Time, T.Amount) IN (SELECT cust_id, max(time), max(Amount)
                                          FROM transactions
                                          GROUP BY cust_id)
GROUP BY C.cust_name, R.Reg_name
ORDER BY C.cust_name


0 commentaires