2010-11-19 132 views
5

我正在SQL Server 2008上開發一個小型存儲過程。我對SQL查詢有一點了解,但足以實現簡單的任務。然而,我想出了一個我無法解決的問題。在我開始解釋我的問題之前,如果我拼寫一個SQL查詢詞是錯誤的,請原諒我,因爲我不是以英語爲母語的人。如何根據其他字段值來總結字段?

我有4個領域(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  

我想要做的是一羣以選擇其IDNAME,總結它的價值在一個名爲positive when ANSWER = 1negative when ANSWER = 0領域。

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

我猜我的問題已被問過幾次,但我無法找到任何關於它的信息,可能是因爲我使用了錯誤的術語。無論如何,如果有人能幫助,這將節省我很多時間。

+0

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

+0

+1,只是因爲這實際上相當不錯問問題。 (還要感謝編輯。)它有簡單的說明性輸入數據,並實際顯示所需的結果集。 – Matt 2010-11-19 16:21:55

+0

我同意馬特,這是一個很好的圖解問題,目標清晰如水。這對非英語母語人士有很大的幫助。 =) – 2010-11-19 16:46:12

回答

4

你會用CASE語句來做。

+0

我認爲你需要刪除select和group中的值子句 – houlgap 2010-11-19 16:17:52

+0

@houlgap:這是我第三次重讀這個問題後才注意到的,以確保我理解了這個問題。謝謝你讓我知道,那很好! =) – 2010-11-19 16:20:25

+0

@Ephismen:這是否正確回答你的問題?我是否正確理解你的需求,或者我錯過了什麼? – 2010-11-19 16:21:09

2

重寫與列的SQL像這樣:

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

1

Ephismen,

你給中有一個隱藏的問題的例子。你會一直有至少一個積極的和一個消極的?如果你只有一個或另一個,而不是兩個都想要發生什麼。當您爲每個ID和名稱有多行時,將表加入自身將不起作用。

兩個單獨的查詢的聯盟將能夠回答這些問題,但不知道它是否適用SQL Server 2008年

您可以通過使用GROUP BY子句對SQL如下來實現這一:

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 

臨時表(內部的選擇與工會)將類似的行回到這個:

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

最終選擇將返回所需RESU lts(將它們相加在一起)。

+0

在我的情況下,總是會有兩個,所以我不必擔心它,但你指出的是真實的。有一天我會面臨這個問題,我會爲你解答,我會爲它+1,因爲這可能會幫助其他人。 – Aymeric 2010-11-19 16:54:35

相關問題