通过多个连接聚合功能

时间:2018-08-22 12:03:46

标签: sql sql-server

我有一个简单的例子来计算每个帐户有多少报价

<svg>

这给出了9个正确的数字。

如果我想显示一个帐户有多少报价和多少订单,我可以尝试这样做:

SELECT 
A.accountId, 
SUM(CASE WHEN Q.QuoteId IS NULL THEN 0 ELSE 1 END) as NumberOfQuotes
FROM Account A 
LEFT JOIN Quote Q ON A.AccountId = Q.AccountId
WHERE A.accountid = '58B3F89E-E1E5-E511-B1F5-4ED0FE97D338'
GROUP BY A.AccountId

这两个数字都为18,这是错误的。

很明显,我做错了。这样可以进行多个聚合/联接吗?

谢谢

1 个答案:

答案 0 :(得分:2)

您可以改用DISTINCT

SELECT A.accountId,
       COUNT(DISTINCT Q.QuoteId) AS NumberOfQuotes,
       COUNT(DISTINCT P.new_propid) AS NumberOfOrders
FROM Account A
     LEFT JOIN Quote Q ON A.AccountId = Q.AccountId
     LEFT JOIN new_prop P ON A.AccountId = P.New_accountid
WHERE A.accountid = '58B3F89E-E1E5-E511-B1F5-4ED0FE97D338'
GROUP BY A.AccountId;

此外,请注意,您无需在CASE的行中使用带有SUM的{​​{1}}表达式。聚合表达式会自动忽略SUM(CASE WHEN Q.QuoteId IS NULL THEN 0 ELSE 1 END)值;除非您有NULL,否则强烈建议:

SET ANSI_NULLS (Transact-SQL)

  

在SQL Server的将来版本中,ANSI_NULLS将为ON,并且任何   将该选项显式设置为OFF的应用程序将生成一个   错误。避免在新的开发工作中使用此功能,并计划   修改当前使用此功能的应用程序。