2012-03-22 54 views
0

鑑於以下形式的表粗化GROUP BY在SQL

CustumerID | Amount 
------------------- 
1   | 100 
1   | 50 
2   | 30 
3   | 40 
4   | 50 

SQL查詢

SELECT SUM(Amount) 
GROUP BY Customer ID 

將返回

CustomerID | Amount 
------------------- 
1   | 150 
2   | 30 
3   | 40 
4   | 50 

有沒有一種方式,以 '變粗' 的GROUP BY語句,使得CustomerIDs 1和2以及CustomerIDs 3和4被組合在一起,即像

CustomerID | Amount 
--------------------- 
1,2   | 180 
3,4   | 90 

返回?

+0

你想如何組合他們 - 總是在2秒? – 2012-03-22 08:49:01

+0

其實,我想按分區分組,比如1..5,6,7,8,9..11,12..14等。我剛剛給出了一個我認爲最小的例子(但顯然不是,因爲有這個捷徑可供參考,請參閱弗洛林的答案。) – Hans 2012-03-22 08:55:12

+0

那麼......編碼之前確定的任意大小的組?如果是這樣,turbanoff的答案是要走的路。 – 2012-03-22 08:57:56

回答

2
select case when CustomerID=1 or CustomerID=2 then '1,2' 
      when CustomerID=3 or CustomerID=4 then '3,4' 
               else CustomerID 
     end 
    , sum(amout) 
from TABLE 
group by case when CustomerID=1 or CustomerID=2 then '1,2' 
       when CustomerID=3 or CustomerID=4 then '3,4' 
               else CustomerID 
     end 
+0

謝謝,這對我有用! – Hans 2012-03-22 08:56:14

2

當然,取決於你想如何分組他們。

在MySQL:

select group_concat(customerid) as customers, sum(amount) as amount 
from your_table 
group by floor((customerid+1)/2) --or another function that returns a unique value for the customers in the group 

在Oracle 11g中:

select list_agg(customerid, ',') as customers, sum(amount) as amount 
from your_table 
group by trunc((customerid+1)/2) --or another function that returns a unique value for the customers in the group 
+0

謝謝但是,我可能已經過分簡化了實際的問題,如果我想將客戶ID分組到一個分區1..4,5,6,7,8,9..11,12..14,該怎麼辦? – Hans 2012-03-22 08:48:10

+0

我不明白。什麼意思是一個分區?你有多少個組?更新你的問題以瞭解真實情況。 – 2012-03-22 08:54:43

+0

實際上它應該是trunc((customerid + 1)/ 2) – arturro 2012-03-22 08:56:22

0

如果你不想創建一個表,我想如果你你至少應該創建一個視圖想讓你的客戶任意組合

這是一個SQL SERVER 2005及更高版本的解決方案,基於一個非常有趣的克答案 https://stackoverflow.com/a/273330/1236044

create table TABLETEST ([CustomerID] INT, [AMOUNT] INT) 
go 
insert into TABLETEST values (1,100) 
insert into TABLETEST values (1,50) 
insert into TABLETEST values (2,30) 
insert into TABLETEST values (3,40) 
insert into TABLETEST values (4,50) 
go 

create view VIEWTESTCAT as 
    select TABLETEST.*,'category1' as [Category] from TABLETEST where CustomerID in (1,2) 
    union 
    select TABLETEST.*,'category2' as [Category] from TABLETEST where CustomerID in (3,4) 
go 

Select [NameValues], SUM([Amount]) from 
(
    SELECT 
    STUFF((SELECT distinct ',' + convert(nvarchar(max),VIEWTESTCAT.[CustomerID]) FROM VIEWTESTCAT 
     where VIEWTESTCAT.Category = VIEWTESTCATALIAS.Category 
     order by ',' + convert(nvarchar(max),VIEWTESTCAT.[CustomerID]) 
     FOR XML PATH ('') 
    ),1,1,'') AS NameValues 
    , Amount 
    FROM VIEWTESTCAT VIEWTESTCATALIAS 
) as TABLETESTAUX 
group by NameValues 

drop view VIEWTESTCAT 
go 

drop table TABLETEST 
go