2010-11-22 5 views
1

Sélectionnons conditionnelle L'objectif:MySQL requête avec deux inline

  • Il y a deux tables, une table des anciens et une table des contributions - chaque contribution est liée par ID
  • Obtenir une liste des anciens élèves des anciens qui ont contribué 2-3000 dans la gamme de 2002-10-10 et 2003-10-10.
  • Résultat doit afficher le nom de anciens, ID, chaque total de anciens donné pour tous les temps, et chaque total des anciens donné pour la plage de dates spécifiée

La tentative:

SELECT alumni.alumni_id, alumni.alumni_name, 
(SELECT SUM(contributed_amt) FROM contribution WHERE contribution.alumni_id = alumni.alumni_id) AS contrib_alltime_total, 
(SELECT SUM(contributed_amt) FROM contribution WHERE contribution.alumni_id = alumni.alumni_id AND contribution.date >= 2002-10-10 AND contribution.date <= 2003-10-10) AS contrib_range_total 

FROM alumni 
WHERE hold_code IS NULL  
ORDER BY lname ASC  
HAVING contrib_range_total >= 2000 
HAVING contrib_range_total <= 3000 

Je reçois une erreur de syntaxe, très probablement parce que j'essaie d'utiliser deux

Je réalise également que vous voulez utiliser un HAVING avec GROUP BY, mais je n'ai pas besoin de d o tout groupement

Je pourrais probablement le faire de cette façon, mais je pense que son inefficacité et pourrait prendre beaucoup de temps

SELECT alumni.alumni_id, alumni.alumni_name, 
(SELECT SUM(contributed_amt) FROM contribution WHERE contribution.alumni_id = alumni.alumni_id) AS contrib_alltime_total, 
(SELECT SUM(contributed_amt) FROM contribution WHERE contribution.alumni_id = alumni.alumni_id AND contribution.date >= 2002-10-10 AND contribution.date <= 2003-10-10) AS contrib_range_total 

FROM alumni 

WHERE hold_code IS NULL 
AND (SELECT SUM(contributed_amt) FROM contribution WHERE contribution.alumni_id = alumni.alumni_id AND contribution.date >= 2002-10-10 AND contribution.date <= 2003-10-10) >= 2000 
AND (SELECT SUM(contributed_amt) FROM contribution WHERE contribution.alumni_id = alumni.alumni_id AND contribution.date >= 2002-10-10 AND contribution.date <= 2003-10-10) <= 3000 

ORDER BY lname ASC 

Quelle serait la façon la plus rapide et la plus efficace d'y parvenir? Tout conseil est le bienvenu, merci pour votre temps

Répondre

0
SELECT a.alumni_id, 
sum(c.contributed_amt) AS contrib_alltime_total, 
sum(case when c.contribution_date BETWEEN '2002-10-10' AND '2003-10-10' then c.contributed_amt else 0 end) AS contrib_range_total 
FROM alumni a 
INNER JOIN contribution c ON c.alumni_id = a.alumni_id 
WHERE a.hold_code IS NULL 
GROUP BY a.alumni_id 
HAVING contrib_range_total BETWEEN 2000 AND 3000 
0
SELECT a.alumni_id, a.alumni_name, 
SUM(c.contributed_amt) AS contrib_alltime_total, 
SUM(c.contributed_amt) AS contrib_range_total 

FROM alumni a, contribution c 

WHERE a.hold_code IS NULL 
AND c.alumni_id = a.alumni_id AND c.date BETWEEN '2002-10-10' AND '2003-10-10' 
AND contrib_range_total BETWEEN 2000 AND 3000 
ORDER BY lname ASC 
+0

Votre suggestion n'a pas fonctionné, donc je l'ai modifiée, mais j'obtiens une erreur "Utilisation invalide de la fonction de groupe" SELECT a.alumni_id, (SÉLECTIONNER LA SOMME (contribute_amt) FROM contribution WHERE contribution.alu mni_id = a.alumni_id) AS contrib_alltime_total, SUM (c.contributed_amt) AS contrib_range_total DE anciens a, contribution c OÙ EST a.hold_code NULL ET c.alumni_id = a.alumni_id ET ENTRE c.contribution_date ' 2002-10-10 'ET' 2003-10-10 ' ET SUM (c.contributed_amt) ENTRE 2000 ET 3000 GROUPE PAR a.alumni_id ORDER BY a.lname ASC – samJL

0

Je ne pense pas que vous pouvez utiliser HAVING sans GROUP BY,, utilisez également AND à se joindre à plusieurs HAVING cas ...

GROUP BY contrib_range_total HAVING contrib_range_total >= 2000 AND contrib_range_total <= 3000