1

我有這樣一個表格:(請注意名稱不是唯一的,可以重複,而Personal_ID是唯一的)。SQL如何在一個字段上求和,並在一個截面中有不同的字段?

ID SourceID  Personal_ID  Name  NumberOfPurchases 
1  4   1001   Alex   10 
2  2   1002   Sara   5 
3  4   1001   Alex   12 
4  1   1003   Mina   200 
5  2   1002   Sara   20 
6  2   1001   Alex   64 

現在需要做的是獲得每個人基於給定SourceID的購買總數。所以,我們有結果sourceId = 4爲:

 Name  Total Number of Purchases 
1.  Alex     22 

而對於的SourceID = 2

 Name  Total Number of Purchases 
1.  Alex     64 
2.  Sara     25 

爲此,我想出了這樣的事情:

SELECT Name,Sum(NumberOfPurchases) AS Total 
FROM tblTEST 
GROUP BY (Personal_ID) 
HAVING (SOURCEID = @id) 

但這顯然錯誤。我卡在這裏,如果我將其他字段添加到group-by clause,結果將完全不同,如果我不這樣做,這個選擇命令將無法正常工作。我怎樣才能達到這樣的結果?

回答

1

我想這裏的問題是,您的SELECT子句中有Name,但您在Personal_ID上分組。如果您明確地將Name也添加到GROUP BY子句中,它可能會有所幫助。如果一切正常,Name無論如何將由功能Personal_ID確定。

你也應該把過濾器放在WHERE子句中的SourceID中,比如Lucero says。所以你的查詢應該是這樣的:

SELECT Name 
     ,Sum(NumberOfPurchases) AS Total 
FROM  tblTEST 
WHERE SOURCEID = @id 
GROUP BY Personal_ID, Name; 

看看這個Fiddle

要澄清一些事情:如果您使用的聚合功能像SUM(),在你SELECT條款所有其他的東西也應該在你的GROUP BY條款。但是你不想只在Name上進行分組,因爲它不是唯一的。這就是爲什麼你的GROUP BY條款中有Personal_IDName。在GROUP BY中缺少Name時,查詢將不會執行。並且您正在添加Personal_ID以確保並非所有Sara都放在一個大薩拉組中,但根據Personal_ID進行分組。

+0

謝謝非常多,但名稱不是唯一的,所以他們可以重複,以便查詢不會給我預期的結果! – Breeze 2013-02-19 11:26:52

+0

'HAVING'僅將集合函數調用的結果與某個值進行比較([MSDN](http://msdn.microsoft.com/zh-cn/library/ms180199.aspx))。這不會編譯。 – 2013-02-19 11:27:12

+0

@Hossein:但Personal_ID和Name **的組合是**唯一的,對嗎?或者你想讓_Alex_組中的不同Alexes和_Sara_組中的Sara組合? – Josien 2013-02-19 11:59:31

1

是這樣的嗎?

SELECT Name, SUM(NumberOfPurchases) AS Total 
FROM tblTEST 
WHERE (SourceID = @id) 
GROUP BY Name 

注:WHERE過濾器分組和HAVING過濾器分組。

+0

謝謝你,但名稱不是唯一的,這就是爲什麼使用Personal_ID得到每個人的購買IM唯一 – Breeze 2013-02-19 11:27:49

+0

'Name'列是分組較差的候選人,名稱不是唯一的。如果您有另一個名爲「Alex」的用戶使用不同的「Personal_ID」,則儘管有兩個不同的人,但他們的所有購買都會被彙總在一起。 – 2013-02-19 11:31:07

+0

@IvanG,雖然你的論點是真實的,但我遵循了OP在原始查詢中選擇的列。由於ID從未被選中,所以兩個GROUP BY都會產生具有相同(不可區分)名稱和一些購買的多行,這也是無稽之談。我的回答是滿足過濾方面的要求。 – Lucero 2013-02-21 17:46:53

1

你可以用這個嘗試:

SELECT names.Name 
     , names.Personal_ID 
     , grouped.Total 
FROM (
      SELECT SourceID 
        , Personal_ID 
        , SUM(NumberOfPurchases) AS Total 
      FROM tblTEST 
      GROUP BY 
        SourceID, Personal_ID 
) grouped 
JOIN (

     SELECT DISTINCT 
       Personal_ID 
       , Name 
     FROM tblTEST 
) names ON  names.Personal_ID = grouped.Personal_ID 
WHERE   SourceID = @id 

這裏是一個SQL Fiddle

在測試數據我補充說,包含一個名爲「亞歷克斯」的人再創紀錄,現在有兩個人同名這表明使用Name列不能執行分組,因爲它不是唯一的。我還在選擇列表中添加了Personal_ID,以便可以區分具有相同名稱的人。

+0

:非常感謝,非常好,我對選擇哪一個作爲答案持懷疑態度,因爲Josiens解決方案很簡單,我選擇了那個。我也喜歡你的SQL小提琴鏈接,它很棒。總之我只是想向您表示我對您的幫助深表讚賞;)再次感謝您:) – Breeze 2013-02-19 17:31:21

+0

不客氣:) Josien的解決方案既好又高效,因爲它被「Personal_ID」和「Name」分組。只有一個名字連接到一個人的ID,所以它很簡單,並且按預期工作。 – 2013-02-19 18:00:58

相關問題