如何从sql中的两个表中获得优秀

时间:2016-03-30 10:02:30

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

我有两张桌子:

  1. 列表项
  2. 收据

    我已经编写了Query,但是在第二个表中找到了一些金额

    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)
            )
    

    这是我的查询:

    
    
        select s.Invone,s.InvDate,s.Type,s.year,s.Terms,s.DueDate,s.Party,s.Party_ID,sum(s.Pieces) AS 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 Balance
    
              from Sells s
         left join Recipt r on s.Invone = r.Invone WHERE s.Party = 'Buyer'
         group by s.Invone,s.InvDate,s.Party,s.Party_ID,s.Type,s.Year,s.Terms,s.DueDate,rate
         having  (sum(s.FinalAmt) - sum(isnull(TotalRecievedAmt, 0)))  0 
         order by s.InvDate, s.Invone
    
    

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

    我需要像Invone一样的输出应该只来一次。和TotalPeices,TotalCarats,TotalGrossAmt,TotalDis1,TotalDis2,TotalFinalAmt不应该被添加2次或3次。

    如果我有Invone no。销售表中有15次,而15份中有3份收据。部分付款。然后在输出TotalPeices,TotalCarats,TotalGrossAmt,TotalDis1,TotalDis2,TotalFinalAmt不应该添加3次。它应该仅显示销售总额中的TotalPeices,TotalCarats,TotalGrossAmt,TotalDis1,TotalDis2,TotalFinalAmt的总和。 从收据表中它应显示TotalHKD,TotalShort,RecievedAmt,TotalRecievedAmt

    的总和

1 个答案:

答案 0 :(得分:0)

我得到了解决方案


    select 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 Balance from 
    (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 from Recipt 
    group by Invone,Rate)as R 
    right outer join
    (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) AS TotalDis1,
      round(sum(DisAmt2), 2) AS TotalDis2, round(sum(FinalAmt), 2) AS TotalFinalAmt from Sells
    group by Invone,InvDate,Type,Year,Terms,DueDate,Party,Party_ID )as S  
     on  S.Invone=R.Invone 
    WHERE S.TotalFinalAmt-isnull(R.TotalRecievedAmt,0)  0