【问题标题】:How to get outstanding from two tables in sql如何从sql中的两个表中脱颖而出
【发布时间】:2016-03-30 10:02:30
【问题描述】:

我有两个表:

  1. 出售
  2. 列表项

收据

我已经编写了查询,但是添加了一些金额,因为它在第二个表中找到

1) 销售表

Create Table Sells(
        ID int,
        Invone varchar (30),
        InvDate DateTime ,
        Year varchar (15),
        Type varchar (10) ,
        Terms varchar (20) ,
        Days int ,
        DueDate DateTime,
        Pieces int ,
        Carats Real ,
        Price Real ,
        GrossAmt Real ,
        Discount1 Real ,
        DisAmt1 Real ,
        Discount2 Real,
        DisAmt2 Real ,
        FinalAmt Real,
        Party varchar (100), 
        Party_ID int,
        Person varchar (100),
        Shape varchar (30),
        Quality varchar (30),
        StockId int,
        SalesExe varchar (50),
        Remarks varchar (200), 
        CreatedDate DateTime,
        ModifiedDate DateTime,
        Username varchar (50))

2) 收据表:

Create Table Receipt (
        ID int ,
        Invone varchar (30),
        RDate DateTime,
        Year varchar (15),
        Type varchar (10),
        HKD Real,
        Rate Real,
        ShortAmt Real,
        RecievedAmt Real,
        TotalRecievedAmt Real,
        FinalAmt Real,
        Party varchar (100),
        Party_ID int,
        Remarks varchar (200),
        CreatedDate DateTime,
        ModifiedDate DateTime,
        Username varchar (50)
        )

这是我的查询:

选择 s.Invone,s.InvDate,s.Type,s.year,s.Terms,s.DueDate,s.Party,s.Party_ID,sum(s.Pieces) A​​S TotalPieces, round(sum(s.Carats), 3) AS TotalCarats, round(sum(s.GrossAmt), 2) AS TotalGrossAmt, round(sum(s.DisAmt1), 2) AS TotalDis1, round(sum(s.DisAmt2), 2) AS TotalDis2, round(sum(s.FinalAmt), 2) AS TotalFinalAmt, isnull(round(sum(HKD), 2), 0) AS TotalHKD, isnull(round(rate, 2), 0) AS Rate, isnull(round(sum(ShortAmt), 2), 0) AS TotalShort,isnull(round(sum(RecievedAmt), 2), 0) AS RecievedAmt, isnull(round(sum(TotalRecievedAmt), 2), 0) AS TotalRecievedAmt, round(sum(s.FinalAmt) - isnull(sum(TotalRecievedAmt), 0), 2) AS 余额 从卖 s left join Recipt r on s.Invone = r.Invone WHERE s.Party = 'Buyer' 按 s.Invone,s.InvDate,s.Party,s.Party_ID,s.Type,s.Year,s.Terms,s.DueDate,rate 分组 有 (sum(s.FinalAmt) - sum(isnull(TotalRecievedAmt, 0))) 0 按 s.InvDate、s.Invone 排序

这是我得到的输出 1:Image of Output

我要求像 Invone 这样的输出应该只出现一次。并且 TotalPeices、TotalCarats、TotalGrossAmt、TotalDis1、TotalDis2、TotalFinalAmt 不应添加 2 次或 3 次。

如果我有 Invone 没有。 15 两次在销售表和 3 次 15 号收据。部分付款。然后在输出 TotalPeices、TotalCarats、TotalGrossAmt、TotalDis1、TotalDis2、TotalFinalAmt 不应添加 3 次。它应该只显示来自销售表的 TotalPeices、TotalCarats、TotalGrossAmt、TotalDis1、TotalDis2、TotalFinalAmt 的总和。 从收据表中应显示 TotalHKD、TotalShort、RecievedAmt、TotalRecievedAmt 的总和

【问题讨论】:

  • 您需要从 GROUP BY 中删除 s.GrossAmt。当您显示它的总和时,您也在 GROUP BY 中使用 s.FinalAmt
  • 我尝试删除 s.FinalAmt 和 s.GrossAmt,但还是会出现相同的答案
  • 您要求我们做很多工作来理解您的查询。您能否发布两个表格的示例数据,预期结果和实际结果?理想情况下使用sqlfiddle.com,这样我们就可以处理查询,而不是做家务。
  • 我已经让它变得简单。请告诉我解决方案

标签: sql sql-server sql-server-2008 sql-query-store


【解决方案1】:

我得到了解决方案

选择 S.Invone,S.InvDate,S.Type,S.Year,S.Terms,S.DueDate,S.Party,S.Party_ID,S.TotalPieces,S.TotalCarats,S.TotalGrossAmt,S.TotalDis1,S .TotalDis2,S.TotalFinalAmt,isnull(R.TotalHKD,0) AS TotalHKD,isnull(R.Rate,0) AS Rate,isnull(R.TotalShort,0) AS TotalShort,isnull(R.RecievedAmt,0) AS RecievedAmt ,isnull(R.TotalRecievedAmt,0) AS TotalRecievedAmt,(round(S.TotalFinalAmt - isnull(R.TotalRecievedAmt, 0), 2)) AS 余额来自 (select Invone, isnull(round(sum(HKD), 2), 0) AS TotalHKD,isnull(round(rate, 2), 0) AS Rate, isnull(round(sum(ShortAmt), 2), 0) AS TotalShort,isnull(round(sum(RecievedAmt), 2), 0) AS RecievedAmt, isnull(round(sum(TotalRecievedAmt), 2), 0) AS TotalRecievedAmt 来自 Recipt 按 Invone、Rate) 分组为 R 右外连接 (select Invone,InvDate,Type,Year,Terms,DueDate,Party,Party_ID,sum(Pieces)as TotalPieces, round(sum(Carats), 3) AS TotalCarats, round(sum(GrossAmt), 2) AS TotalGrossAmt, round (sum(DisAmt1), 2) 作为 TotalDis1, round(sum(DisAmt2), 2) AS TotalDis2, round(sum(FinalAmt), 2) AS TotalFinalAmt 来自 Sells 按 Invone,InvDate,Type,Year,Terms,DueDate,Party,Party_ID 分组为 S 在 S.Invone=R.Invone WHERE S.TotalFinalAmt-isnull(R.TotalRecievedAmt,0) 0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-27
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 2011-01-30
    • 1970-01-01
    • 2012-03-17
    • 2017-03-19
    相关资源
    最近更新 更多