Вернуть две строки для каждой строки в таблице - PullRequest
2 голосов
/ 06 июня 2019

У меня есть таблица транзакций. Я хочу вернуть две строки из каждой строки. Таблица транзакций имеет одну строку для каждой транзакции. Я хотел бы вернуть дату транзакции и сумму в формате записи журнала ниже:

TransactionDate  TransactionRef      Transaction Amount
  01/01/2019       12345                   500.5

Мне также нужно включить столбец дебет / кредит, чтобы первая запись строки была положительной суммой с дебетом / кредитом, отображающим «Db», тогда вторая возвращенная строка будет отрицательной с дебетом / кредитом, отображающим «Cr»

Мне нужно запросить таблицу транзакций и вернуть значения ниже:

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

Ответы [ 6 ]

3 голосов
/ 06 июня 2019

Просто еще один вариант - это перекрестная заявка

 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)
1 голос
/ 06 июня 2019
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)
1 голос
/ 06 июня 2019

С 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
0 голосов
/ 06 июня 2019

Если значения всегда положительны в исходной таблице, я бы использовал вариант решения Джона:

select t.TransactionDate, t.TransactionRef, v.drcr, v.TransactionAmount
from t Cross Apply
     ( values ('Cr', TransactionAmount),
              ('Dr', - TransactionAmount)
     ) v(drcr, TransactionAmount);
0 голосов
/ 06 июня 2019

Вы можете использовать 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
0 голосов
/ 06 июня 2019

Используйте запрос на объединение:

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

Идея состоит в том, что вторая половина вышеприведенного запроса на объединение генерирует ту же запись, но с отрицательным значением суммы транзакции и Cr в качествеэтикетка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...