在GROUP BY SQL查询中计算COUNT

时间:2013-03-28 08:53:34

标签: sql sql-server performance

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

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。

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

1 个答案:

答案 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]