【问题标题】:Get SUMs for dimension record from several fact tables从多个事实表中获取维度记录的 SUM
【发布时间】:2014-10-30 04:39:35
【问题描述】:

我必须在以下 2 个查询中计算出正确的值:

Select Finances.CustomerID,
sum(Finances.Total)Total
from Finances
group by Finances.CustomerID
order by Finances.CustomerID

Select Invoices.CustomerID,
sum(Invoices.InvoiceValue)InvoiceValue
from Invoices
group by Invoices.CustomerID
order by Invoices.CustomerID

在财务表中,客户可以从多个订单中欠款,因此对于此示例,假设客户必须支付 £100+ £400 + £500,总计为 £1000。

客户随后收到第一张 100 英镑的发票,并支付了这笔费用。

所以第二个查询现在将显示 100 英镑......然后我想从这 2 个值中计算第三列,从等于 900 英镑的 1000 英镑中减去 100 英镑(剩下的支付金额)

这是我的表结构:

还有很多相关联的表,但是这是我使用 select 语句的数据所在:)

我将如何编写 sql 语句来完成这一切,还是不可能?理想情况下,我希望在 INSERT -> SELECT -> WHERE NOT EXISTS 语句中使用,或者在视图中填充。感谢您的帮助

样本数据:

【问题讨论】:

    标签: sql sql-server sql-server-2012


    【解决方案1】:
    CREATE VIEW CustomerFinances AS
        ;WITH FinancesCTE AS
        (
            Select Finances.CustomerID,
            sum(Finances.Total)Total
            from Finances
            group by Finances.CustomerID
        ),InvoicesCTE AS
        (
            Select Invoices.CustomerID,
            sum(Invoices.InvoiceValue)InvoiceValue
            from Invoices
            group by Invoices.CustomerID
        )
        SELECT C.*,
               F.Total AS FinanceTotal,
               I.InvoiceValue
        FROM   Customers C
               LEFT JOIN FinancesCTE F
                   ON C.CustomerID = F.CustomerID
               LEFT JOIN InvoicesCTE I
                   ON C.CustomerID = I.CustomerID
    
    GO
    

    【讨论】:

    • “; WITH FinancesCTE”是什么意思? FinancesCTE 是新表/视图的名称吗?并感谢您的帮助
    • 是公用表表达式。详情technet.microsoft.com/en-us/library/…。您可以将其包装在视图中。我会更新我的答案。
    • 它返回数百万个结果...从外观上看,它关联了所有 CustomerID 中的所有 Finances.Total、Invoices.Value
    • 首先,在运行视图时添加WHERE 子句。正如我所看到的,它应该为每个客户安排一排。一些样本数据会有所帮助。
    • 哦,我看到了错误!!!!它在第一个 Join C.CustomerId = C.CustomerId 上。我会更新的。
    【解决方案2】:

    试试这个,

    CREATE VIEW CustomerFinanceDetails AS 
    (
    
     select c.*,isnull(FinanceTotal,0) as FinanceTotal,isnull(InvoiceTotal,0) as InvoiceTotal 
     from 
     (select * from Customers) c
       left outer join 
     (select CustomerID,isnull(SUM(Total),0) as FinanceTotal from Finances group by CustomerID) f on c.CustumerID=f.CustomerID
       left outer join 
     (select CustomerID,isnull(SUM(InvoiceValue),0) as InvoiceTotal from Invoices group by CustomerID) i on c.CustumerID= i.CustomerID
    
    )
    

    【讨论】:

      猜你喜欢
      • 2016-08-04
      • 1970-01-01
      • 1970-01-01
      • 2014-01-23
      • 2022-10-04
      • 2021-01-27
      • 2020-12-30
      • 2016-08-13
      • 2021-11-26
      相关资源
      最近更新 更多