2013-03-28 131 views
1

我有查询由下面的一个产品项目来计算总金额:计算COUNT BY SQL查询

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])是唯一的订单数由一个产品项目。

,而不是计数,但(问题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

所以你试过只使用'+'? – zerkms 2013-03-28 08:55:06

回答

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] 
+0

我明白了,非常感谢。有用。 – 2013-03-28 09:20:45

+0

我认为你的答案应该被接受,因为我建立了使用你的例子的查询:) – 2013-03-28 10:58:21