你只需要了解sqlserver中的join。这里我们使用 innerjoin 来表示一对一的关系。
declare @Category Table(ID int, Name varchar(50))
declare @Product Table(ID int, Name varchar(50), Price int)
declare @Product_Category_Mapping Table (ID int, CategoryID int, ProductID int)
insert into @Category values (1,'a'),(2,'b'),(3,'c')
insert into @Product values (1,'p1',10),(2,'p2',20),(3,'p3',30)
insert into @Product_Category_Mapping values (1,1,1),(2,1,2),(3,2,3)
select
c.id, avg(price)
from @Product_Category_Mapping pcm
inner join @Product p on p.id = pcm.ProductID
inner join @Category c on c.id = pcm.CategoryID
group by c.id
更新
作为您的评论,我理解并更新如下代码。有问题请告诉我。
declare @Product Table(ID int, Name varchar(50), Price int)
declare @Product_Category_Mapping Table (ID int, CategoryID int, ProductID int)
insert into @Category values (1,'a'),(2,'b'),(3,'c')
insert into @Product values (1,'p1',10),(2,'p2',20),(3,'p3',30)
insert into @Product_Category_Mapping values (1,1,1),(2,1,2),(3,2,3)
select --Category.[name] as CatName, Product.[Id], Product.[Name], [Price]
c.id,
c.Name,
p.ID,
p.Name,
avg(isnull(price,0)) over(partition by c.id ) as avgprice
from @Category c
left join @Product_Category_Mapping pcm on c.id = pcm.CategoryID
left join @Product p on p.id = pcm.ProductID