我有查询以计算以下一项产品的总金额:
SELECT p.[Id], COUNT(o.[Id]), SUM(o.[Amount])
FROM [dbo].[Order] o
INNER JOIN [dbo].[Product] p ON p.[Id] = o.[ProductId]
GROUP BY p.[Id]
在这种情况下,COUNT(o.[Id]) 是一个产品项目的唯一订单数。
但不是 COUNT(o.[Id]) 我想使用下一个公式计算订单数:
COUNT(o.[OwnerId]) -- where o.[OwnerId] IS NOT NULL
+
COUNT(o.[Id]) -- where o.[OwnerId] IS NULL
我可以在一个查询中实现它吗?什么解决方案会更好地提高性能?
更新:
我很抱歉我的快速完成。Mahmoud Gamal 提供了一个很好的例子,但它计算的有点不同。
SELECT
p.[Id],
COUNT(DISTINCT CASE WHEN o.[OwnerId] IS NOT NULL THEN o.[OwnerId] ELSE NULL END) AS [NumberOfOrderOwners],
SUM(CASE WHEN o.[OwnerId] IS NULL THEN 1 ELSE 0 END) AS [NumberOfAnonimousOwners],
SUM(o.[Amount])
FROM [dbo].[Order] o
INNER JOIN [dbo].[Product] p ON p.[Id] = o.[ProductId]
GROUP BY p.[Id]
上面的查询根据我的需要计算,但估计成本增加了两倍,因为我在 COUNT 中使用了 DISTINCT。
有人可以帮我改进我的查询吗?