Greg Crossan Ответов: 2

T-SQL single row соответствующие строки


У меня есть SQL-таблица, похожая на эту (стандарт MSSQL 2017)

Key Period  Year    Srce   Destination   Amt
001 001    2018     A      B             100
002 001    2018     A      C             200
003 001    2018     B      A             99
004 001    2018     C      A             180


Начальные передачи в первых двух рядах, взаимные во 2-х двух рядах

Мне нужно получить это (1 строка для каждого в обратном переводе
Prd Year Srce SourceAmount  Dest Variance Source Dest Period Year Amount
001 2018 A    100           B    1        B      A    001    2018 99
001 2018 A    100           C    20       C      A    001    2018 180


В принципе, сведенных одной строки с совпадающими источник/приемник, приемник/источник дисперсии

Пожалуйста, помогите, заранее спасибо.

Что я уже пробовал:

Рекурсивный CTE, повороты и т. д. , похоже, ничто не дает мне ожидаемых результатов

Это в конечном итоге будет кормить отчет SSRS.

CHill60

Почему бы не опубликовать код, который ближе всего подошел к желаемым результатам, и мы можем пойти оттуда.
Вы также можете попытаться объяснить, что такое взаимный перенос, вы не дали нам никакого контекста вообще.
И тот факт, что он в конечном итоге будет подан в отчет SSRS, на самом деле не имеет отношения к этой проблеме

2 Ответов

Рейтинг:
2

Maciej Los

Похоже, вам нужно объединить данные на основе period, year и source/destination

SELECT t1.Period AS Prd, t1.Year AS Year1, t1.Srce AS Src1, t1.Amt AS SourceAmount, t1.Desttination AS Dest1,
    t2.Amt - t1.Amt AS Variance, t2.Srce As Src2, t2.Destination AS Dest2, t2.Period, t2.Year AS Year2, t2.Amd AS Amount
FROM YourTable AS t1
    INNER JOIN YourTable As t2 ON 
        t1.Period = t2.Period AND 
        t1.Year = t2.Year AND
        t1.Srce = t2.Destination AND
        t1.Key < t2.Key


Подробнее о присоединениях: Визуальное представление SQL-соединений[^]


Рейтинг:
0

Member 7870345

Пожалуйста, попробуйте

SELECT     period, year,
	CASE WHEN srce<destination THEN srce ELSE destination END as srce,
	CASE WHEN srce<destination THEN destination ELSE srce END as dest,
	SUM(CASE WHEN srce<destination THEN amt ELSE -amt END) as variance,
	SUM(CASE WHEN srce<destination THEN amt ELSE 0 END) as srcamount,
	SUM(CASE WHEN srce<destination THEN 0 ELSE amt END) as destamount
FROM         dbo.data
GROUP BY period,year, 
	CASE WHEN srce<destination THEN srce ELSE destination END,
	CASE WHEN srce<destination THEN destination ELSE srce END