Tôi hy vọng sau mẫu mã là tự giải thích:Làm cách nào để kết hợp GROUP BY và ROW_NUMBER?
declare @t1 table (ID int,Price money, Name varchar(10))
declare @t2 table (ID int,Orders int, Name varchar(10))
declare @relation table (t1ID int,t2ID int)
insert into @t1 values(1, 200, 'AAA');
insert into @t1 values(2, 150, 'BBB');
insert into @t1 values(3, 100, 'CCC');
insert into @t2 values(1,25,'aaa');
insert into @t2 values(2,35,'bbb');
insert into @relation values(1,1);
insert into @relation values(2,1);
insert into @relation values(3,2);
select T2.ID AS T2ID
,T2.Name as T2Name
,T2.Orders
,T1.ID AS T1ID
,T1.Name As T1Name
,T1Sum.Price
FROM @t2 T2
INNER JOIN (
SELECT Rel.t2ID
,MAX(Rel.t1ID)AS t1ID
-- the MAX returns an arbitrary ID, what i need is:
-- ,ROW_NUMBER()OVER(Partition By Rel.t2ID Order By Price DESC)As PriceList
,SUM(Price)AS Price
FROM @t1 T1
INNER JOIN @relation Rel ON Rel.t1ID=T1.ID
GROUP BY Rel.t2ID
)AS T1Sum ON T1Sum.t2ID = T2.ID
INNER JOIN @t1 T1 ON T1Sum.t1ID=T1.ID
Kết quả:
T2ID T2Name Orders T1ID T1Name Price
1 aaa 25 2 BBB 350,00
2 bbb 35 3 CCC 100,00
gì tôi cần là nhận xét ở trên, một cách để có được những ROW_NUMBER
mà còn để Group By
ở nơi đầu tiên. Vì vậy, tôi cần sum
của tất cả giá T1 được nhóm theo T2.ID
trong bảng quan hệ và trong truy vấn bên ngoài là t1ID
với mức giá cao nhất.
Nói cách khác: Cách thay đổi MAX(Rel.t1ID)AS t1ID
để phần nào trả về ID có giá cao nhất?
Vì vậy, các kết quả mong muốn là (lưu ý rằng T1ID đầu tiên thay đổi 2-1 vì nó có giá cao hơn):
T2ID T2Name Orders T1ID T1Name Price
1 aaa 25 1 AAA 350,00
2 bbb 35 3 CCC 100,00
Note: trong trường hợp bạn đang tự hỏi tại sao tôi không nhân Orders
với Giá: chúng không được thực hiện (vì vậy tôi nên rời khỏi cột này vì nó hơi mơ hồ một chút, xin vui lòng bỏ qua nó, tôi vừa thêm nó để làm cho tất cả ít trừu tượng hơn). Trên thực tế, Orders
phải không thay đổi, đó là lý do cho cách tiếp cận phụ truy vấn để tham gia cả hai và lý do tại sao tôi cần nhóm theo địa điểm đầu tiên.
Kết luận: rõ ràng là cốt lõi của câu hỏi của tôi có thể được trả lời bằng những OVER
clause có thể được áp dụng cho bất kỳ chức năng tổng hợp như SUM
(xem Damien's answer) những gì là mới mẻ với tôi. Cảm ơn tất cả vì cách tiếp cận làm việc của bạn.
Không nên là 'AAA' trong kết quả cuối cùng thay vì' BBB'? –