这仅仅是一个存储过程的选择一部分,但它应该告诉你该怎么做:
declare @products table
(
Name varchar(50),
id int
)
declare @orderitems table
(
id int,
orderid int,
productid int,
orderitemquantity int
)
declare @orders table
(
orderid int,
ordertotal decimal(18,2)
)
insert into @products VALUES ('apple', 1)
insert into @products VALUES ('orange', 2)
insert into @products VALUES ('pear', 3)
insert into @products VALUES ('melon', 4)
insert into @orders values(1, 19.0)
insert into @orders values(2, 25.5)
insert into @orders values(3, 9.5)
insert into @orders values(4, 13.5)
insert into @orders values(5, 8.5)
insert into @orderitems VALUES(1, 1, 1, 20)
insert into @orderitems VALUES(2, 1, 2, 10)
insert into @orderitems VALUES(3, 2, 3, 5)
insert into @orderitems VALUES(4, 2, 4, 4)
insert into @orderitems VALUES(5, 3, 1, 10)
insert into @orderitems VALUES(6, 3, 2, 5)
insert into @orderitems VALUES(7, 4, 3, 3)
insert into @orderitems VALUES(8, 4, 4, 2)
insert into @orderitems VALUES(9, 5, 1, 5)
insert into @orderitems VALUES(10, 5, 4, 2)
;WITH summary as
(
SELECT p.Name as ProductName,
COUNT(o.orderid) as 'Orders Count',
ISNULL(Sum(o.ordertotal),0) AS 'Total Sales Value',
ISNULL(Sum(oi.orderitemquantity),0) AS 'Total Sales Quantity'
FROM @products p
INNER JOIN @orderitems oi on oi.productid = p.id
INNER JOIN @orders o on o.orderid = oi.orderid
GROUP BY p.Name
)
SELECT ProductName, [Orders Count], [Total Sales Value], [Total Sales Quantity],
RANK() OVER (ORDER BY [Total Sales Value] DESC) AS ValueRanking,
RANK() OVER (ORDER BY [Total Sales Quantity] DESC) AS QuantityRanking FROM summary
注意这里的几件事情。此代码可以剪切并粘贴到Management Studio查询窗口中并按照这种方式运行。它从一些表格声明开始并插入示例数据。当问一个问题时,如果你做这部分工作总是有用的;人们更可能回答,如果最无聊的一点就完成了!
COUNT()不需要ISNULL保护;如果没有值,它返回0。
最终给出的数据,你会看到ValueRanking和QuantityRankings是不同的(我拨弄数据得到这个,只是为了说明这一点)。这意味着最终结果只能由其中一个排序(或实际上由任何其他列排序 - 排序依赖于排序)。
HTH