2012-03-22 57 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