2010-11-19 7 views
5

Je suis en train de développer une petite procédure stockée sur SQL server 2008. J'ai peu de connaissances sur les requêtes SQL, mais assez pour réaliser des tâches simples. Cependant, j'ai trouvé un problème que je ne peux pas résoudre moi-même. Avant de commencer à expliquer mon problème, veuillez me pardonner si j'épelle une requête SQL erronée parce que je ne suis pas anglophone.Comment résumer un champ en fonction d'une autre valeur de champ?

J'ai 4 champs (représentation CSV):

ID, NAME, VALUES, ANSWER 
25, Tom , 2400 , 0     
25, Tom , 600 , 0     
25, Tom , 500 , 1     
25, Tom , 300 , 1     
27, Jerry, 100, 0     
27, Jerry, 20, 1     
27, Jerry, 60, 1     
27, Jerry, 2000, 0  

Ce que je veux faire est un groupe par la sélection par ses ID et NAME, somme ses valeurs dans un champ nommé positive when ANSWER = 1 et negative when ANSWER = 0.

ID, NAME, SUM, NEGATIVE, POSITIVE 
25, Tom, 3000, 800     
27, Jerry, 2100, 80 

Je suppose que ma question a été posée à plusieurs reprises, mais je n'ai pas pu trouver quoi que ce soit à ce sujet, probablement parce que je suis en utilisant les termes erronés. De toute façon, si quelqu'un pouvait m'aider, cela me ferait gagner beaucoup de temps.

+0

http://stackoverflow.com/questions/30563/sql-returning-the-sum-of-items-depending-on-which-type-it-is – JNK

+0

+1, juste parce que c'est en fait un joli puits Question posée (Merci aussi à l'éditeur.) Il a des données d'entrée simples et illustratives et montre en fait le jeu de résultats souhaité. – Matt

+0

Je suis d'accord avec Matt, c'est une question bien illustrée et l'objectif est clair comme de l'eau. Cela aide beaucoup pour les anglophones non-natifs. =) –

Répondre

4

Vous le ferez avec une instruction CASE.

+0

Je pense que vous devez supprimer les valeurs des clauses select et group by – houlgap

+0

@houlgap: C'est ce que j'ai remarqué après avoir relu la question pour la troisième fois pour m'assurer de bien comprendre la question. Merci de me le faire savoir, c'est bien! =) –

+0

@Ephismen: Est-ce que cela répond à votre question correctement? Ai-je bien compris votre besoin ou sis-je quelque chose? –

2

Ressaisissez votre SQL avec des colonnes comme celle-ci:

sum(case when answer=0 then values else 0 end) negative

1

Ephismen,

L'exemple que vous donnez a un problème caché en elle. En aurez-vous toujours au moins un positif et un négatif? Qu'est-ce que vous voulez arriver si vous avez seulement l'un ou l'autre et pas les deux. Rejoindre la table à elle-même ne fonctionnera pas lorsque vous avez plusieurs lignes pour chaque identifiant et nom.

Une union de deux requêtes distinctes seront en mesure de répondre à ces questions, mais ne savez pas si elle applique pour le serveur SQL 2008.

Vous pourriez être en mesure de réaliser cela en utilisant le groupe par clause SQL comme suit :

select id 
    , name 
    , sum (neg_values) as negative 
    , sum (pos_values) as positive 
    from         -- temporary table 
    (select id 
      , name 
      , sum (values) as neg_values 
      , 0   as pos_values -- placeholder 
     from mytable 
     where answer = 0     -- negative 
     group by id 
       , name 
     union all 
     select id 
      , name 
      , 0   as neg_values -- placeholder 
      , sum (values) as pos_values 
     from mytable 
     where answer = 1     -- positive 
     group by id 
       , name 
    ) 
    group by id 
     , name 

La table temporaire (intérieure select avec l'union) retourne des lignes similaires à ceci:

id name neg_value pos_value 
25 tom  3000   0 
25 tom   0  800 
27 jerry  2100   0 
27 jerry  0  80 

La finale select retournera votre rESU désiré lts (les additionnant).

+0

Dans mon cas, il y aura toujours les deux, donc je n'ai pas à m'inquiéter à ce sujet, mais ce que vous avez souligné est vrai. Je vais vous sauver la réponse dans le cas où je fais face à ce problème un jour, et je vais le +1 car cela pourrait aider les autres. – Aymeric

Questions connexes