【问题标题】:Get credit and debit in a single row sql在单行 sql 中获取信用卡和借记卡
【发布时间】:2020-02-05 12:35:39
【问题描述】:

我无法找到与帐户相关的报告 我需要在一行中获得信用卡账户和借记账户..with amount

我的桌子是这样的

Id  VoucherId   AccountId   Amount  AccountName IsDebit
1   1           26          100     Sales       0
2   1           10          100     Cash        1
3   2           26          200     Sales       0
4   2           10          200     Cash        1
5   3           10          150     Cash        0
6   3           20          150     Expense A   1
7   4           10          240     Cash        0
8   4           21          240     Expense B   1

我需要得到这样的结果 VoucherId DebitName DebitID CreditName CreditID Amount
1 Cash 10 Sales 26 100 2 Cash 10 Sales 26 200 3 Expense a 10 Cash 26 150 4 Expense b 10 Cash 26 240
我试过这个

select vc.Id,
am.Name,vc.AccountName,vd.[Description],
    case when vd.isdebit=1 then vd.amount else 0 end  as C6,
    case when vd.isdebit=1 then vd.AccountId else 0 end as A,
    case when vd.isdebit=0 then vd.amount else 0 end as C7,
    case when vd.isdebit=0 then vd.AccountId else 0 end as B
    from VoucherDetails vd 
    inner join Voucher Vc on vc.Id=vd.VoucherId and vc.IsDeleted=0
    inner join AccountsMaster Am on am.Id=vd.AccountId

和许多其他查询,但没有得到上述结果

请帮助..提前感谢

【问题讨论】:

    标签: c# sql accounting


    【解决方案1】:

    如果您进行复式输入,这将起作用。也就是说,每个借方条目也应该有一个贷方条目。

    select DrVoucherId as VoucherId,DebitName,DebitId,CreditName,CreditId,Amount from (
    select VoucherId as DrVoucherId,AccountName as DebitName ,AccountId as DebitId from VoucherDetails where IsDebit=1
    ) a
    left join
    (select VoucherId as CrVoucherId,AccountName as CreditName ,AccountId as CreditId,Amount from VoucherDetails where IsDebit=0) b on  a.DrVoucherId=b.CrVoucherId
    

    【讨论】:

      【解决方案2】:

      像这样?:

      select VoucherId,
        max(case when IsDebit = 1 then AccountID end) DebitID,
        max(case when IsDebit = 1 then am.Name end) DebitName,
        max(case when IsDebit = 0 then AccountID end) CreditID,
        max(case when IsDebit = 0 then am.Name end) CreditName,
        Amount
      from VoucherDetails vd
        join AccountsMaster am on am.Id = AccountID
      group by VoucherId, Amount
      order by VoucherId
      

      在这里测试:http://sqlfiddle.com/#!18/25162/13

      【讨论】:

        【解决方案3】:

        你需要聚合:

        select vc.Id, 
               sum(case when vd.isdebit = 1 then vd.amount else 0 end)  as C6,
               sum(case when vd.isdebit = 1 then vd.AccountId else 0 end) as A,
               sum(case when vd.isdebit = 0 then vd.amount else 0 end) as C7,
               sum(case when vd.isdebit = 0 then vd.AccountId else 0 end) as B
        from VoucherDetails vd join
             Voucher Vc 
             on vc.Id = vd.VoucherId and vc.IsDeleted = 0 join
             AccountsMaster Am
             on am.Id = vd.AccountId
        group by vc.Id
        

        【讨论】:

        • 实际上我需要将两行合并为1,其中凭证ID相同,您的查询为每个凭证ID返回2行,感谢您的快速回复
        • @丽莎。 . .然后从 selectgroup by 中删除所有未聚合的列,凭证 ID 除外。
        猜你喜欢
        • 2014-10-27
        • 2010-12-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-07
        • 2012-07-22
        • 2011-02-04
        • 2011-12-02
        • 2013-08-20
        相关资源
        最近更新 更多