我有查询按以下一个产品项目计算总金额:
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。
有人可以帮我改进查询吗?
答案 0 :(得分:2)
试试这个:
SELECT
p.[Id],
SUM(CASE WHEN o.[OwnerId] IS NOT NULL THEN 1 ELSE 0 END) +
SUM(CASE WHEN o.[Id] IS NULL THEN 1 ELSE 0 END) AS Total
FROM [dbo].[Order] o
INNER JOIN [dbo].[Product] p ON p.[Id] = o.[ProductId]
GROUP BY p.[Id]