2010-11-19 4 views
5

Ich entwickle eine kleine gespeicherte Prozedur auf SQL Server 2008. Ich habe wenig Kenntnisse über SQL-Abfragen, aber genug, um einfache Aufgaben zu erreichen. Aber ich habe ein Problem, das ich selbst nicht lösen kann. Bevor ich anfange, mein Problem zu erklären, entschuldige mich bitte, wenn ich ein SQL-Abfragewort falsch schreibe, weil ich kein englischer Muttersprachler bin.Wie summiere ich ein Feld in Abhängigkeit von einem anderen Feldwert?

Ich habe 4 Felder (CSV-Darstellung):

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  

Was ich tun möchte, ist Gruppe durch die Auswahl durch seine ID und NAME, SUM es die Werte in einem Feld mit dem Namen positive when ANSWER = 1 und negative when ANSWER = 0 auf.

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

Ich denke, meine Frage mehrmals gefragt worden, aber ich war nicht in der Lage, etwas dagegen zu finden, wahrscheinlich, weil ich die falschen Begriffe verwenden. Jedenfalls, wenn jemand helfen könnte, würde mir das viel Zeit sparen.

+0

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

+0

+1, nur weil das ist eigentlich ein ziemlich gut gestellte Frage. (Auch dank dem Editor.) Es hat einfache, anschauliche Eingabedaten und zeigt tatsächlich die gewünschte Ergebnismenge an. – Matt

+0

Ich stimme Matt zu, das ist eine gut illustrierte Frage und das Ziel ist klar wie Wasser. Dies hilft viel für nicht-englische Muttersprachler. =) –

Antwort

4

Sie tun dies mit einer CASE-Anweisung.

+0

Ich denke, Sie müssen Werte aus den Select- und Group by Klauseln entfernen – houlgap

+0

@houlgap: Das ist, was ich bemerkte, nachdem ich die Frage zum dritten Mal erneut gelesen habe, um sicherzustellen, dass ich die Frage verstanden habe. Danke, dass Sie mich wissen lassen, das ist nett! =) –

+0

@Ephismen: Beantwortet das deine Frage richtig? Habe ich dein Bedürfnis richtig verstanden, oder fehlt mir etwas? –

2

Rewrite Ihre SQL mit Säulen wie folgt aus:

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

1

Ephismen,

Das Beispiel Sie geben ein verstecktes Problem in sich hat. Wirst du immer mindestens einen positiven und einen negativen haben? Was willst du tun, wenn du nur das eine oder das andere und nicht beides hast? Die Verknüpfung der Tabelle mit sich selbst funktioniert nicht, wenn Sie mehrere Zeilen für jede ID und jeden Namen haben.

eine Vereinigung von zwei getrennten Abfragen wird diese Fragen beantworten können, aber nicht sicher, ob es für SQL Server 2008 gilt

Sie können in der Lage sein, dies zu erreichen, indem die Gruppe durch Klausel für SQL wie folgt verwendet werden :

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 

Die temporäre Tabelle (innere wählen Sie mit Union) werden Zeilen zurück wie folgt aus:

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

Der letzte wählen Sie die gewünschte resu zurück lts (summiert sie zusammen).

+0

In meinem Fall wird es immer beides geben, also muss ich mich nicht darum kümmern, aber was Sie darauf hingewiesen haben, ist wahr. Ich werde dir die Antwort in dem Fall ersparen, in dem ich dieses Problem eines Tages habe, und ich werde es +1 geben, da dies anderen helfen könnte. – Aymeric

Verwandte Themen