2009-10-20 7 views
1

J'ai ce sql ci-dessous que j'utilise pour comparer les valeurs de z. Je mets z dans une sous-requête et ensuite la compare. Mon QN est dans mon autre instruction ci-dessous, je veux mettre dans une autre formule pour calculer quelque chose d'autre dont l'information est seulement disponible dans une autre table appelée var1 (par exemple, n). Je voudrais mettre sum (n)/count (n) pour finir comme cv dans mon autre instruction. puis faites une déclaration de cas si le cv> 10 est alors trop grand, si < 10 trop peu.une sous-requête dans une sous-requête - est-ce possible?

suis-je supposé faire une autre sous-requête dans cette sous-requête? tout conseiller pls. Merci!

select 
z, 
CASE 
when z > 1 then 'Pls increase your inputs' 
when z < -1 then 'Pls decrease your inputs' 
else 'No comment' END as Input 

from 

(select 
    case 
    when S < 0 then (S/En-Eg)) 
    else (S/En+Eg)) 
    end as z 
from var2); 
+0

S'il vous plaît spécifier la saveur de SQL que vous essayons d'utiliser. –

+0

Et une définition de table d'échantillon, avec l'échantillon que vous attendez? – Andomar

+0

désolé pour la réponse tardive. que voulez-vous dire par la saveur de SQL? Définition de la table pour la table var2 S entier En float Par exemple, flotteur Table adroite pour var1 n entier sortie exemple serait: - Z Condition Commentaires -------- ---------------------------------------- > 1 'Augmenter vos entrées' <-1 'Pls diminuer vos entrées' <1 & > -1 Si somme (n)/compte (n)> 10 alors 'LARGE' Sinon 'PETIT' S'il vous plaît laissez-moi savoir si vous avez besoin d'autres informations? – rayhan

Répondre

3

Vous êtes sur la bonne voie. Pour les agrégats comme SUM() et COUNT(), je suggère d'utiliser une sous-requête corrélée; c'est-à-dire que la sous-requête est assurée de renvoyer une valeur agrégée (SUM (n)/COUNT (n)) pour chaque valeur de clé (var1.primary_key).

Par exemple, cette requête utilise un sous-requête corrélée pour renvoyer la valeur que vous désirez, faire SUM (n)/COUNT (n) disponible à la requête externe:

SELECT  v.z, 
      CASE WHEN v.z > 1 
       THEN 'Pls increase your inputs' 
       WHEN v.z < -1 
       THEN 'Pls decrease your inputs' 
       ELSE 'No comment' END AS INPUT, 
      CASE WHEN v.cv > 10 
       THEN 'Pls decrease your inputs' 
       WHEN v.cv < 10 
       THEN 'Pls increase your inputs' 
       ELSE 'No comment' END AS INPUT      
    FROM  (SELECT  CASE WHEN s < 0 
           THEN (s/en - eg) 
           ELSE (S/En+Eg) END AS 'z', 
         ISNULL(AVG_N.cv, 0) AS 'cv' 
       FROM  var2 
         INNER JOIN 
         (
          SELECT  var1.primary_key AS 'PrimaryKey', 
             SUM(var1.N)/COUNT(var1.N) AS 'cv' 
          FROM  var1 
          WHERE  var1.primary_key = var2.primary_key 
          GROUP BY var1.N 
         ) AVG_N 
         ON AVG_N.PrimaryKey = var2.primary_key 
      ) v 
Questions connexes