none
SQL如何查询余额? RRS feed

  • 问题


  • 假设有一下三个数据表:

    Cash
    Date            Amount
    6/22/2012    1000
    7/18/2012    200

    Buy
    Date           Price  Lot
    6/23/2012   23     12
    7/11/2012   22     10

    Sale
    Date          Price  Lot
    7/3/2012    33     10
    7/12/2012  30     10

    用下列查询句:

    Select Date, Amount, '0' from Cash
    Union All
    Select Date, Price * Lot, '0' from Buy
    Union All
    Select Date, '0', Price * Lot from Sale
    Order by Date

    结果如下:

    Date              Dr       Cr
    6/22/2012      1000
    6/23/2012                276
    7/3/2012        330
    7/11/2012                220
    7/12/2012      300
    7/18/2012      200

    假设我想添加一个余额列以便产生以下结果,请问如何写查询句?

    Date             Dr      Cr      Balance
    6/22/2012     1000           1000
    6/23/2012              276    724
    7/3/2012       330             1054
    7/11/2012              220    834
    7/12/2012     300             1134
    7/18/2012     200             1334

     

    2012年8月22日 5:39

答案

  • declare @Cash table([Date] date,Amount int)
    Declare @Buy table([Date] date,Price int,Lot int)
    Declare @Sale table([Date] date,Price int,Lot int)
    insert into @Cash values('6/22/2012',1000)
    insert into @Cash values('7/18/2012',200)
    insert into @Buy values('6/23/2012',23,12)
    insert into @Buy values('7/11/2012',22,10)
    insert into @Sale values('7/3/2012',33,10)
    insert into @Sale values('7/12/2012',30,10)
    
    ;with CashCET([Date],Dr,Cr)
    as
    (
        select [Date],Amount,0 from @Cash
        union all
        select [Date],0,Price*Lot from @Buy
        union all
        select [Date],Price*Lot,0 from @Sale
    )
    select [Date],Dr,Cr,Balance=(select SUM(Dr)-SUM(Cr) from CashCET as B where B.[Date] <=A.[Date]) from CashCET as A order by [Date] 
    结果如下:
    Date            Dr    Cr     Balance
    2012-06-22 1000 0      1000
    2012-06-23 0      276   724
    2012-07-03 330   0      1054
    2012-07-11 0      220   834
    2012-07-12 300  0       1134
    2012-07-18 200  0       1334
    • 已标记为答案 栾涅 2012年8月22日 9:01
    2012年8月22日 8:02

全部回复

  • declare @Cash table([Date] date,Amount int)
    Declare @Buy table([Date] date,Price int,Lot int)
    Declare @Sale table([Date] date,Price int,Lot int)
    insert into @Cash values('6/22/2012',1000)
    insert into @Cash values('7/18/2012',200)
    insert into @Buy values('6/23/2012',23,12)
    insert into @Buy values('7/11/2012',22,10)
    insert into @Sale values('7/3/2012',33,10)
    insert into @Sale values('7/12/2012',30,10)
    
    ;with CashCET([Date],Dr,Cr)
    as
    (
        select [Date],Amount,0 from @Cash
        union all
        select [Date],0,Price*Lot from @Buy
        union all
        select [Date],Price*Lot,0 from @Sale
    )
    select [Date],Dr,Cr,Balance=(select SUM(Dr)-SUM(Cr) from CashCET as B where B.[Date] <=A.[Date]) from CashCET as A order by [Date] 
    结果如下:
    Date            Dr    Cr     Balance
    2012-06-22 1000 0      1000
    2012-06-23 0      276   724
    2012-07-03 330   0      1054
    2012-07-11 0      220   834
    2012-07-12 300  0       1134
    2012-07-18 200  0       1334
    • 已标记为答案 栾涅 2012年8月22日 9:01
    2012年8月22日 8:02
  • 对不起,看不懂,“Balance"是怎样查询出来的?怎么查询句里没有呢?是不是有漏掉?
    2012年8月22日 8:21
  • 看最后一行SQL
    2012年8月22日 8:26
  • 我看到的最后一行是:

    select [Date],Price*Lot,0 from @Sale
    )

    没有”Balance“的句子呀!

    2012年8月22日 8:39
  • 对“梁孟”的回答补充:

    declare @Cash table([Date] date,Amount int)
    Declare @Buy table([Date] date,Price int,Lot int)
    Declare @Sale table([Date] date,Price int,Lot int)
    insert into @Cash values('6/22/2012',1000)
    insert into @Cash values('7/18/2012',200)
    insert into @Buy values('6/23/2012',23,12)
    insert into @Buy values('7/11/2012',22,10)
    insert into @Sale values('7/3/2012',33,10)
    insert into @Sale values('7/12/2012',30,10)
    
    ;with CashCET([Date],Dr,Cr)
    as
    (
        select [Date],Amount,0 from @Cash
        union all
        select [Date],0,Price*Lot from @Buy
        union all
        select [Date],Price*Lot,0 from @Sale
    )
    select [Date],Dr,Cr,Balance=(select SUM(Dr)-SUM(Cr) from CashCET as B where B.[Date] <=A.[Date]) from CashCET as A order by A.Date

    梁:我发现你解答好好哦……可以加我为好友吗?我的QQ:424148000,请注明“梁孟”。


    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年8月22日 9:01
    版主
  • 不知怎的我的网页看不到全部回复,后来用全选拷贝才知道漏掉一部分。答案正是我想要的,谢谢您!

    2012年8月22日 9:04
  • 再请教一下,如果不用CTE而直接从三个数据表查询该怎样写?
    2012年8月22日 9:24