SQL子查询行项目表的总和

SQL子查询行项目表的总和,sql,ms-access,Sql,Ms Access,我有三张桌子: 客户 闭合器 密室拱门 每个都由客户ID字段链接。CLOSEDORDERS和CLOSEDORDERSARCHIVES是一张表格,上面有销售过的每张发票的每一行项目。我试图计算出客户的终身总收入,但最终的总收入还是被我卡住了。以下是我写的内容,它在两列中为每个表输出正确的总计(一些值为空): 当我搜索时,我发现这个答案似乎很相似,但我无法让它工作,是不是因为这些总和是从表中的行项目中求和的,并按客户分组?另外,这是我的第一个问题,有没有更有效的方法来编写/完成这个问题 我们可以先把

我有三张桌子: 客户 闭合器 密室拱门

每个都由客户ID字段链接。CLOSEDORDERS和CLOSEDORDERSARCHIVES是一张表格,上面有销售过的每张发票的每一行项目。我试图计算出客户的终身总收入,但最终的总收入还是被我卡住了。以下是我写的内容,它在两列中为每个表输出正确的总计(一些值为空):

当我搜索时,我发现这个答案似乎很相似,但我无法让它工作,是不是因为这些总和是从表中的行项目中求和的,并按客户分组?另外,这是我的第一个问题,有没有更有效的方法来编写/完成这个问题


我们可以先把这个问题分解成一个更简单的问题:把所有需要的东西放在一张表中

如果求和所需的唯一列是数量和sellprices(当然还有ID),则可以在子查询中合并它们,然后计算其总数。子查询将类似于:

select CustomerID as 'ID', Quantity as 'Quantity', SellPrice as 'SellPrice'
from CLOSEDORDERSARCHIVE

UNION ALL

select CustomerID as 'ID', Quantity as 'Quantity', SellPrice as 'SellPrice'
from CLOSEDORDERS
...COALESCE(co.Total,0) + COALESCE(coa.Total,0) AS 'Grand Total'...
之后,您可以从该子查询中选择并按客户ID分组,然后您将获得每个客户的总和:

select ID, SUM(Quantity*SellPrice) from(

select CustomerID as 'ID', Quantity as 'Quantity', SellPrice as 'SellPrice'
from CLOSEDORDERSARCHIVE

UNION ALL

select CustomerID as 'ID', Quantity as 'Quantity', SellPrice as 'SellPrice'
from CLOSEDORDERS
) as subq1
GROUP By ID

我想这就是你需要的。如果您希望显示客户名称和类似的内容,甚至可以将最后一个查询与表Customers联接起来=)

我认为最不直观的解决方案是在子查询上联接(啊!)。下面是一个(过于简化,请参见下面的警告)示例:

在本例中,我们将创建两个中间表(co和coa),其中包含表中列出的每个客户的CLOSEDORDERS和ClosedordersCarchive订单总数

警告:如果一家公司的CLOSEDORDERS或CLOSEDORDERSARCHIVE中没有订单,则该公司的co.Total(或coa.Total)将为空。您需要对此进行检查,否则加法将出错(IIRC NULL+a number=NULL)。所以SELECT子句的“co.Total”和“coa.Total”表达式应该使用COALESCE或CASE语句来检查它。比如:

select CustomerID as 'ID', Quantity as 'Quantity', SellPrice as 'SellPrice'
from CLOSEDORDERSARCHIVE

UNION ALL

select CustomerID as 'ID', Quantity as 'Quantity', SellPrice as 'SellPrice'
from CLOSEDORDERS
...COALESCE(co.Total,0) + COALESCE(coa.Total,0) AS 'Grand Total'...

当我试着运行这个时,我得到了“FROM子句中的语法错误”,它说的是哪一行?我在这里找不到sintax错误,它突出显示了第一行“UNION ALL”。这是在Access中,我不知道这是否有区别这是一个很好的解决方案,但它假设所有公司都下了订单。如果一家公司还没有下订单,它就不会出现在结果中。我假设询问者仍然想列出它们,只是总数为“0”。为了保证所有公司都能上市,不管订单如何,您可能必须从客户开始,并至少进行一次外部联接。看看我的答案。@Damieh-是的,我错过了你答案的那一部分!jgiblets—如果这样做,请记住它必须是一个外部联接——在这种情况下是一个右外部联接,并且必须检查是否为null。IIRC SQL server不喜欢子查询后的
AS
,因此访问方式可能是相同的。它是可选的,因此如果给您带来麻烦,您可以将其删除:
)“co”位于c.ID=co.CustomerID
。SQL Server喜欢子查询名称前的“as”。我一直在做,相信我=)