我有一个简单的例子来计算每个帐户有多少报价
<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,这是错误的。
很明显,我做错了。这样可以进行多个聚合/联接吗?
谢谢
答案 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
,否则强烈建议:
在SQL Server的将来版本中,ANSI_NULLS将为ON,并且任何 将该选项显式设置为OFF的应用程序将生成一个 错误。避免在新的开发工作中使用此功能,并计划 修改当前使用此功能的应用程序。