Поворот таблицы SQL Server - PullRequest
3 голосов
/ 06 июля 2019

Пример данных из таблицы SQL Server показан ниже:

+------------+---------+---------+-----+-------+--------+--------+
|    Date    | Account |  Head   | D_C | TxnID | AmCode | Amount |
+------------+---------+---------+-----+-------+--------+--------+
| 15-05-2019 |     123 | Savings | D   |     5 | SV     |    150 |
| 15-05-2019 |     123 | Cash    | C   |     5 | SV     |    150 |
| 16-05-2019 |     367 | Loan    | D   |     6 | LN     |    200 |
| 16-05-2019 |     367 | Cash    | C   |     6 | LN     |    200 |
+------------+---------+---------+-----+-------+--------+--------+

Есть две пары (4 строки), показанные выше. Все поля в каждой паре одинаковы (даже если данные не отсортированы - хотя они отсортированы выше), за исключением Head и D_C Column, которые различны для пары.

Я ищу отчет, как показано ниже на примере выше:

+------------+---------+---------+--------+-------+--------+--------+
|    Date    | Account | D Head  | C Head | TxnID | AmCode | Amount |
+------------+---------+---------+--------+-------+--------+--------+
| 15-05-2019 |     123 | Savings | Cash   |     5 | SV     |    150 |
| 16-05-2019 |     367 | Loan    | Cash   |     6 | LN     |    200 |
+------------+---------+---------+--------+-------+--------+--------+

Это одна строка в отчете для пары с комбинацией Head + D в одном столбце и комбинацией Head + C в другой.

Обратите внимание, что в реальных данных пары могут не отображаться вместе, как указано выше. Однако конкатенация полей, отличных от Head + D_C, делает сцепленную строку уникальной для пары строк.

Заранее спасибо за помощь.

Ответы [ 2 ]

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

Попробуйте с условной агрегацией:

declare @tmp table
(
     [Date]  date,  
     Account int,   
     Head    varchar(50),  
     D_C     char(1),  
     TxnID   int,  
     AmCode  char(2),  
     Amount  int
)

insert into @tmp
values
 ('2019-05-15', 123, 'Savings', 'D', 5, 'SV', 150) 
,('2019-05-15', 123, 'Cash'   , 'C', 5, 'SV', 150) 
,('2019-05-16', 367, 'Loan'   , 'D', 6, 'LN', 200) 
,('2019-05-16', 367, 'Cash'   , 'C', 6, 'LN', 200) 

select  
  [Date]
, Account
, max(case when D_C='D' then Head end )as [D Head]
, max(case when D_C='C' then Head end )as [C Head]
, TxnID
, AmCode
, Amount 
From @tmp
group by [Date], Account, TxnID, AmCode, Amount

Результаты:

enter image description here

2 голосов
/ 06 июля 2019

Если я правильно понимаю, вы хотите объединить дебетовую и кредитную пары, которые имеют одинаковое значение:

  • Date
  • Account
  • TxnID
  • AmCode
  • Amount

Сохраняя при этом оба описания Head для дебетов и кредитов.

;with Debit --Define Debit CTEas only debit lines
as
(
    SELECT *
    FROM datatable
    WHERE D_C='D'
),
Credit  --Define Credit CTE as only debit lines
as
(
    SELECT *
    FROM datatable
    WHERE D_C='C'
)
SELECT DISTINCT --Get only unique lines
    d.[Date],
    d.[Account],
    d.Head as [D Head],
    c.Head as [C Head],
    d.TxnID,
    d.AmCode,
    d.Amount
From [Debit] d
INNER JOIN --Join on all the same fields
    [Credit] c
ON 
    d.Date = c.Date
AND 
    d.Account = c.Account
AND 
    d.TxnID = c.TxnID
AND 
    d.AMCode = c.AmCode
AND 
    c.Amount = d.Amount

Этот код выше основан на том факте, что у вас будет только одна дебетовая и одна кредитная линия на пару. Если это не так, код необходимо будет изменить.

Выход:

Output

...