1

我有查询以计算以下一项产品的总金额:

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。

有人可以帮我改进我的查询吗?

4

1 回答 1

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]
于 2013-03-28T08:57:16.117 回答