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
3 Réponses :
Vous ne pouvez pas combiner plusieurs conditions avec un mais je vous recommande vivement de passer à une jointure code> explicite code> dans la clause de FRO ( p> 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 Vous devez également inclure toutes les colonnes qui ne sont pas utilisées dans une agrégation dans le groupe code> clause code>. p> La requête complète devrait donc ressembler à quelque chose comme suit: p> , code> dans la clause WHERE. Vous voulez probablement un et là: (p.class_id, p.cclass) code> au lieu de p.class_id, p.cclass code>. p>
Merci pour vos commentaires. Je reçois maintenant une erreur "Pas un groupe d'expression".
Vous devez inclure r.reg_name code> 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 b> 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.
Je recommanderais correctement Cependant, je ne suis pas sûr que cette logique utilise quelque chose d'utile. Vous devriez probablement demander à une nouvelle question em> avec des données d'échantillonnage et des résultats souhaités. P> p> joindre code> syntaxe et em> à l'aide des fonctions de la fenêtre. Je pense que vous voulez quelque chose comme ceci:
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
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 code> qui semble manquer la deuxième partie@Joakimdanielson - La partie avec
p.class_id, p.cclass code> semble être... (p.class_id, p.cclass) dans (sélectionnez max (class_id), classe. .. code>. Idito et égalementT.Time, t.Amount code> doit être entre parenthèses.