【问题标题】:Get a sum from a temp table into my select query从临时表中获取总和到我的选择查询中
【发布时间】:2015-06-30 04:55:41
【问题描述】:

我有一些 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 表中的总和。

我不知道如何将电子邮件加入交叉连接。或者我什至不知道如何做到这一点?

【问题讨论】:

    标签: sql sql-server tsql


    【解决方案1】:

    您无需使用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 方法聚合查询只会运行一次。

    【讨论】:

      猜你喜欢
      • 2017-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-26
      • 2013-04-03
      • 2020-02-13
      • 1970-01-01
      相关资源
      最近更新 更多