Как динамически рассчитать столбец со значениями, зависящими от предыдущих расчетов, с помощью Joins? - PullRequest
0 голосов
/ 18 сентября 2018

Текущая таблица выглядит так:

Каждый объект имеет уникальное имя, его родительское имя и иерархию.

name parent hierarchy value
 A     A        1     100
 B     A        2     0.5
 C     B        3     0.5

Мой ожидаемый результат:

name parent hierarchy value
 A     A        1     100
 B     A        2     50
 C     B        3     25

Мой запрос

    SELECT tb1.[name],
           tb1.[parent],
           tb1.[hierarchy],
           CASE
             WHEN tb1.[hierarchy]=1
               THEN tb1.[value]
             WHEN tb1.[hierarchy]=2
               THEN tb1.[value]*tb2.[value]
           AS [value]
           FROM 
                table tb1
           INNER JOIN 
                table tb2
           ON
                tb1.[parent]= tb2.[name]

Этот код работает, только если у нас есть иерархия 2. Как изменить его, чтобы он работал для любого числа значений иерархии.

EDIT:

Что если у него есть идентификатор, с помощью которого мы можем однозначно идентифицировать данные?

id     name   parent    hierarchy    value
 1        A     A       1             100
 1        B     A       2              50
 1        C     B       3              25
 2        A     A       1              30
 2        D     A       2              0.1

1 Ответ

0 голосов
/ 18 сентября 2018

Вы можете попытаться использовать cte recursive рекурсивную иерархию и затем самостоятельно присоединиться к исходной таблице.

;with cte as(
 SELECT name,parent,hierarchy,value
 FROM T
 WHERE hierarchy = 1 
 UNION ALL
 SELECT t2.name,t2.parent, t1.hierarchy+1,t1.value * t2.value
 FROM CTE t1 join T t2 on t1.hierarchy+1 = t2.hierarchy
 WHERE t2.name <> t2.parent 
)

SELECT * 
FROM cte

sqlfiddle

Результат

name    parent  hierarchy   value
A       A        1          100
B       A        2          50
C       B        3          25
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...