我有一些SQL调用存储过程并从各个用户返回多个行。每行都有一个金额,我想得到每个用户的金额总和到另一个选择查询。
所以获取金额的查询;
Declare @tempUserPurchases table(
Email nvarchar(50), Amount money
)
-- get all the data into the temp table.
insert into @tempUserPurchases
exec stpGetUserPurchases @CompanyId = 312546
因此,上面会为每个成员生成几条记录,每条记录都包含一封电子邮件和一笔金额以及所有指定公司的记录。
现在我有另一个Select语句,我想把上面查询中每个成员的总和放入相应的成员记录中。
select
FirstName,
LastName,
Email,
tblSum.Amount
Into #returnedTable
from
tblMembers
Cross Join
(
Select sum(Amount) Amount from @tempUserPurchases
Where email = returnedTable.email
) tblSum
所以最后我应该每封电子邮件最后一行,其中包含tempUserPurchases表中的总和。
我无法弄清楚如何将电子邮件发送到Cross Join。或者我甚至不知道如何做到这一点?
答案 0 :(得分:2)
您无需执行CROSS JOIN
,因为这会为您提供笛卡尔积。您可以使用LEFT JOIN
(或者,如果您确定表变量中始终存在匹配项,则可以使用INNER JOIN
,因为它会稍快一些)。
像这样:
SELECT FirstName, LastName, Email, tblSum.Amount
FROM tblMembers
LEFT JOIN (
SELECT email, SUM(Amount) AS Amount
FROM @tempUserPurchases
GROUP BY email
) AS tblSum ON tblSum.email=tblMembers.email
您尝试这样做的方式称为相关子查询。为了使其工作,它需要在SELECT
子句中。
SELECT FirstName, LastName, Email, (
SELECT SUM(Amount)
FROM @tempUserPurchases AS t
WHERE t.email=m.email
) AS Amount
FROM tblMembers AS m
但是,join方法的执行效果会更好,因为必须为每一行计算相关的子查询。使用JOIN
方法,聚合查询只会运行一次。