从临时表中获取总和到我的选择查询中

时间:2015-06-30 04:55:42

标签: sql sql-server tsql

我有一些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。或者我甚至不知道如何做到这一点?

1 个答案:

答案 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方法,聚合查询只会运行一次。