我正在寻找指针和可能的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
但我必须考虑到之前从未出售过的产品。
非常感谢任何帮助。
谢谢,
迈克尔
答案 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
中的所有字段都放在聚合中。 select
和where
条款无需更改
left outer join
是获取所有产品的价值,即使是那些尚未售出的产品。
coalesce()
是为了确保不匹配的行最后(或第一个)取决于您是希望大多数单位是第一个还是最少单位。
如果您按UnitsSold
订购,那么您可能希望在select
中包含该值。