根据另一个表中的信息对结果集进行排序

时间:2014-01-25 14:30:28

标签: sql-server

我正在寻找指针和可能的t-sql示例。我有一份产品清单,我希望根据另一张表中销售的单位数进行分类。

因此,我在Products表中有一个ProductID字段,在OrderLine表中有一个ProductID字段,我想要执行以下操作:

SELECT ProductID, etc, etc FROM Products WHERE clause here ORDER BY (UnitsSold in other table)

我希望我的其他查询与此类似:

 SELECT ProductID, SUM(Qty) AS UnitsSold Order By UnitsSold

但我必须考虑到之前从未出售过的产品。

非常感谢任何帮助。

谢谢,

迈克尔

2 个答案:

答案 0 :(得分:2)

使用“sales”表上的左连接和coalesce(您也可以在sql server中使用isnull)运算符

select p.productId, coalesce(sum(s.qty), 0) as unitsold
from Product p
left join sales s on p.productid = s.productId
group by p.productId
order by unitsold

答案 1 :(得分:0)

我建议使用子查询(或CTE)进行计算:

SELECT ProductID, etc, etc
FROM Products p left outer join
     (select ProductId, sum(qty) as UnitsSold
      from OrderLine ol
      group by ProductId
     ) ol
     on ol.ProductId = p.ProductId
WHERE clause here
ORDER BY coalesce(ol.UnitsSold, 0) desc;

在子查询中进行聚合的原因是您不需要将select中的所有字段都放在聚合中。 selectwhere条款无需更改

left outer join是获取所有产品的价值,即使是那些尚未售出的产品。

coalesce()是为了确保不匹配的行最后(或第一个)取决于您是希望大多数单位是第一个还是最少单位。

如果您按UnitsSold订购,那么您可能希望在select中包含该值。