2013-03-24 147 views
0

我有一個表如下所示薩姆和GROUP BY子句

 
Name   Id   Sub1  Sub2 
Raj   1   75   76 
Ramesh  2   85   58 
Sekhar  3   65   55 
Siddharth 4   95   85  
Raj   1   52   75 
Sekhar  3   97   95 
Siddharth 5   78   85 

我需要的輸出如下

 
Name   Id  Sub1  Sub2 
Raj   1   127  151 
Ramesh  2   85  58 
Sekhar  3   162  150  
Siddharth 4   95  85 
Siddharth 5   78  85 

即我需要有標記的總和在主題列和由Id列組成。我需要顯示名稱,但不應將其包含在GroupBy子句中。 我應該如何編寫查詢以獲得所需的結果?提前致謝。

+1

所以如果,例如,編號2被分組,這意味着顯示應該是拉梅什(第一=分鐘(名稱))或Sekhar(最後= MAX(名稱))的名字?如果列不包含在group by子句中,您必須決定應該如何聚合這些列。 – 2013-03-24 10:55:37

+0

什麼是Sekhar的真實ID?它是'2'還是'3'? – 2013-03-24 11:09:25

+0

對Sekhar來說,它是3. – vikasse 2013-03-24 11:27:36

回答

1

試試這個: -

with cte as 
( Select row_number() over(partition by a.id order by a.ID) rn, 
    a.name,a.id , b.sum1, b.sum2 from 
    sample a 
    inner join 
    (Select id,sum(sub1) Sum1,sum(sub2) as sum2 
    from Sample 
    group by id)b 
    on a.id=b.id 
) 
Select name,id,sum1,sum2 from cte where rn=1 

,或者您也可以使用SumSubquery

Select * 
from 
(
    Select name,id,sum(sub1) over (partition by id) sub1, 
    sum(sub2) over(partition by id) sub2, 
    row_number() over(partition by Id order by id) rn 
    from sample 
) s 
where rn=1 
order by s.name 

SQLFIDDLE演示

+1

基於對這個問題的所有各種評論/澄清,我會說這裏的第二個查詢看起來像是最好的選擇。唯一缺少的是訂購'row_number'子句的更好的列;僅僅通過Id排序,不能保證一致的結果。希望OP可以提供更多關於表格的信息,或者可以在'row_number'中使用某種時間列來使所有工作都能正常工作。 – 2013-03-24 12:09:36

0

好像所有的澄清後,它真的只是簡單:

select Name 
    , Id 
    , Sub1 = sum(Sub1) 
    , Sub2 = sum(Sub2) 
from MyTable 
group by Name, Id 
order by Id 

SQL Fiddle with demo

+0

名稱列不能包含在GroupBy子句中。那是我遇到麻煩的地方。 – vikasse 2013-03-24 11:40:26

+0

爲什麼您不能在集團名稱中包含名稱?你在查詢結果中顯示它,所以應該包含它。查詢結果正是你所需要的。 – 2013-03-24 11:42:06

+0

這就像我在我的實際場景中有更多的列像地址,名字,姓氏。因此,地址可能已被修改,因此我無法在groupby子句中包含所有這些列。對不起,沒有列出所有這些列。 – vikasse 2013-03-24 11:45:23

0

如果你需要通過排除從組NameOver條款子句,假設你的id是一個唯一的標識符,並且只有ID被分配到1個nam即,聚集體Name使用MAX()

SELECT 
    MAX(Name) AS [Name] 
    ,Id 
    ,SUM(Sub1) AS [Sub1] 
    ,SUM(Sub2) AS [Sub2] 

FROM 
    MyTable 

GROUP BY 
    Id 

ORDER BY 
    Id