【问题标题】:Return two rows for each row in table为表中的每一行返回两行
【发布时间】:2019-10-22 03:12:18
【问题描述】:

我有一个事务表,我希望从每一行返回两行。事务表对于每个事务都有一行。我想以以下日记帐分录格式返回交易日期和金额:

TransactionDate  TransactionRef      Transaction Amount
  01/01/2019       12345                   500.5

我还需要包含一个借方/贷方列,以将第一行作为正数发布,借方/贷方显示“Db”,然后返回的第二行将是负数,借方/贷方显示“Cr”

我需要查询 Transaction 表并返回以下值:

TransactionDate  TransactionRef      Transaction Amount      Db/Cr
  01/01/2019       12345                   500.5              Db
  01/01/2019       12345                   -500.5             Cr

【问题讨论】:

  • 原始表中的值是否总是正数?
  • 原表中的值可正可负

标签: sql sql-server


【解决方案1】:

另一个选项是交叉应用

 Select A.TransactionDate
       ,A.TransactionRef
       ,B.TransactionAmount
       ,DrCr  = case when sign(B.TransactionAmount)<0 then 'Cr' else 'Dr' end
 From   YourTable A
 Cross Apply ( values ( TransactionAmount)
                     ,( TransactionAmount*-1)
             ) B(TransactionAmount)

【讨论】:

  • @SeanLange 感谢您的笑容。今天吃了我的小麦。
【解决方案2】:

使用 UNION ALL:

select 
  *,
  case when TransactionAmount > 0 then 'Db' else 'Cr' end AS [Db/Cr] 
from tablename
union all
select 
  TransactionDate,  
  TransactionRef,
  -1.0 * TransactionAmount,
  case when TransactionAmount > 0 then 'Cr' else 'Db' end
from tablename
order by TransactionDate, TransactionRef, TransactionAmount desc

【讨论】:

  • 谢谢大家。我正在使用 Sami 的解决方案,因为我发现了一些交易金额为负的记录。我不得不扩展 CASE 语句,现在在 Db 和一个 Cr 上得到两行。非常感谢社区对此解决方案的快速响应和技巧。
  • 不是故意的。一定是在其他显示器上工作时不小心点击了。
【解决方案3】:
Select 
  coalesce(t1.transactiondate,t2.transactiondate) as transdate, 
  coalesce(t1.transactionref,t2.transactionref) as transref,    
  coalesce(t1.transactionamount,-1*ABS(t2.transactionamount)) as transamount  
from tansaction t1 full outer join transaction t2 
on 1 = 0 
order by 
  TransactionRef, 
  transactiondate,    
  SIGN(t1.transactionamount)desc,
  ABS(t2.transactionamount)

【讨论】:

    【解决方案4】:

    使用联合查询:

    SELECT TransactionDate, TransactionRef, [Transaction Amount], 'Db' AS [Db/Cr]
    FROM yourTable
    UNION ALL
    SELECT TransactionDate, TransactionRef, -1.0*[Transaction Amount], 'Cr'
    FROM yourTable;
    

    这里的思路是上述联合查询的后半部分生成相同的记录,但交易金额为负数,标签为Cr

    【讨论】:

      【解决方案5】:

      您可以使用UNION ALL 并从您的事务表中进行 2 次选择。

      SELECT TransactionDate,  TransactionRef,      [Transaction Amount], 'Db' AS [Db/Cr] from table
      
      UNION ALL 
      
      SELECT TransactionDate,  TransactionRef,      [Transaction Amount] * -1, 'Cr' AS [Db/Cr] from table
      

      【讨论】:

        【解决方案6】:

        如果原始表中的值始终为正,我将使用 John 解决方案的变体:

        select t.TransactionDate, t.TransactionRef, v.drcr, v.TransactionAmount
        from t Cross Apply
             ( values ('Cr', TransactionAmount),
                      ('Dr', - TransactionAmount)
             ) v(drcr, TransactionAmount);
        

        【讨论】:

          猜你喜欢
          • 2015-08-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-02-09
          • 1970-01-01
          • 2023-04-03
          • 2018-12-17
          相关资源
          最近更新 更多