2017-09-09 5 views
0

Mes données sont une table parent nommée sales et une table enfant nommée sale_lines. Je voudrais sélectionner tous les enregistrements de la table salessale.customer_id=X OU SUM(sale_lines.total)>=Y.Comment créer une requête O WH X OU Y Y

La condition customer_id ira dans la clause WHERE et il est logique d'avoir la SUM(sale_lines.total)>Y dans la clause HAVING. Mon problème est comment avoir un OR logique entre les clauses WHERE et HAVING. Est-ce possible? Si c'est le cas, comment?

Je sais comment faire cela avec une sous-requête, mais j'essaie de développer une solution de génération automatique de requêtes et je voudrais éviter la complexité de traiter les sous-requêtes.

Répondre

1

Vous devez faire dans la clause having:

select . . . 
from . . . 
group by s.customer_id, . . . 
having s.customer_id = X or sum(s.total) > Y; 

La requête pourrait ressembler à:

select s.customer_id, sum(s.total) 
from sales s 
group by s.customer_id 
having s.customer_id = X or sum(s.total) > Y; 

En raison de la or, vous ne pouvez pas filtrer avant l'agrégation.

En fait, si vous voulez que les enregistrements de la table des ventes (et non les agrégations), alors quelque chose comme cela est approprié:

select s.* 
from sales s 
where s.customer_id = X or 
     s.customer_id in (select s2.customer_id 
         from sales s2 
         group by s2.customer_id 
         having sum(s2.total) > Y 
         );