2014-07-09 107 views
1

我有一個包含以下列的表:ClientID,OrderID,ProductID,數量,每個ProductID每個OrderID只出現一次,每個OrderID只對應一個ClientID。按列分組的聚合函數

樣本數據:

ClientID OrderID ProductID Quantity 
1   100  25   10 
1   100  30   20 
1   101  27   10 
1   101  30   10 
1   102  27   30 
2   103  27   10 
2   104  15   10 

我需要做到以下幾點:同時通過客戶端ID和產品ID分組我需要應用聚合函數爲其他列,所以結果集包含每個客戶端ID最低的OrderID以及每個ClientID的每個ProductID的Quantity列的總和。結果集的行數等於每個ClientID中不同ProductID的數量,並且每行的OrderID =每個ClientID的最低OrderID,而不考慮ProductID。

所需的結果:

ClientID OrderID ProductID Quantity 
1   100  25   10 
1   100  30   30 
1   100  27   40 
2   103  27   10 
2   103  15   10 

我試圖實現這一目標使用以下查詢:

select ClientID, min(OrderID) as OrderID, ProductID, sum(Quantity) as Quantity 
from table 
group by ClientID, ProductID 

但由於分組,結果集包含每個客戶端ID多OrderIDs:

當前結果:

ClientID OrderID ProductID Quantity 
1   100  25   10 
1   100  30   30 
1   101  27   40 
2   103  27   10 
2   104  15   10 

請注意第三行和第四行的OrderID在兩個結果中的差異。

回答

3
select 
    ClientID, MinOrderID, ProductID, SUM(quantity) 
from 
(
    select ClientID, min(OrderID) over (partition by ClientID) as MinOrderID, ProductID, Quantity 
    from yourtable 
) v 
group by ClientID, MinOrderID, ProductID 

或替代地

select distinct 
    ClientID, 
    min(OrderID) over (partition by ClientID), 
    ProductID, 
    sum(Quantity) over (partition by ClientID, ProductID)  
from yourtable 
+0

感謝。我嘗試了第二種選擇,因爲它只使用一條select語句,它的作用就像一個魅力。 – ovidiufelixb

1
create table dbo.aatest 
(
    ClientID int not null, 
    OrderID int not Null, 
    ProductID int not null, 
    Quantity int not null 
); 

insert into dbo.aatest values (1,100,25,10) 
insert into dbo.aatest values (1,100,30,20) 
insert into dbo.aatest values (1,101,27,10) 
insert into dbo.aatest values (1,101,30,10) 
insert into dbo.aatest values (1,102,27,30) 
insert into dbo.aatest values (2,103,27,10) 
insert into dbo.aatest values (2,104,15,10) 

select * from dbo.aatest; 

select 
    T.ClientID, 
    M.OrderID, 
    ProductID, 
    TotalQuantity = SUM(Quantity) 
from 
    (select 
     ClientID, 
     OrderID = MIN(OrderID) 
    from 
     dbo.aatest 
    group by 
     ClientID) as M 
    join dbo.aatest as T 
     on M.ClientID = T.ClientID 
group by 
    T.ClientID, 
    M.OrderID, 
    ProductID 
order by 
    ClientID, 
    ProductID