2017-10-17 16 views
0

J'ai du mal à simplifier/alias la requête SQL suivante. Je suis assez nouveau à SQL, j'espère que quelqu'un peut me diriger vers la bonne direction. Comme la 2ème partie de la ligne est à peu près identique à la 1ère partie autre que la condition Où, j'espère juste l'appeler une variable "X".Comment puis-je simplifier/alias cette requête SQL

J'ai essayé d'expérimenter avec différentes parenthèses et ordre mais j'ai continué à obtenir l'erreur de syntaxe. Mon code est le suivant:

select 
(select avg(stars) from LONG EXPRESSION where Condition < Y) 
- 
(select avg(stars) from LONG EXPRESSION where Condition > Y) 

Idéalement je voudrais pour obtenir quelque chose de similaire à

select 
(select avg(stars) from (LONG EXPRESSION) X where Condition < Y) 
- 
(select avg(stars) from X where Condition > Y) 

Merci pour votre aide.

Dan

Répondre

0

Essayez d'utiliser l'agrégation conditionnelle:

select avg(case when Condition < Y then stars end) - 
     avg(case when Condition > Y then stars end) 
from LONG EXPRESSION 
0

Je ne sais pas votre cas d'utilisation, mais que diriez-vous de les combiner en une seule requête:

SELECT IF(Condition < Y, 'Less Than Y', 'GTE Y'), AVG(stars) 
FROM long expression 
GROUP BY 1 
+0

Merci Matt, il pourrait être mon SQLite, il ne me laisser utiliser la fonction SI. Mais oui, c'est certainement une façon plus élégante de le faire. Je vais juste devoir prendre la différence de valeur des 2 rangs que je suppose. – DanC

0

Mysql développeurs équipe a annoncé que la version 8.0 aura Common Table Expressions in MySQL (CTEs). Ainsi, il sera probablement possible d'écrire des requêtes comme ceci:

WITH my_cte AS 
(
(LONG EXPRESSION) 
) 
select (select avg(stars) from (LONG EXPRESSION) X where Condition < Y) - (select avg(stars) from X where Condition > Y);