2015-12-02 4 views
0

У меня есть эта таблица:Выполнение рекурсивных SQL Query (SQL Server 2005)

ID_Articulo ID_Componente Tipo Cantidad 
1   5    2  1.5 
5   3    1  3 
1   6    1  6 
2   3    1  3.5 
6   8    2  4.2 
8   9    1  2 

Мне нужно найти SUM поля Cantidad для данного ID_Articulo и типо = 1. Например, для ID_Articulo = 1 должно быть 1.5 * 3 + 6 + 6 * 4.2 * 2 = 60.9.

Число до уровня (глубокое) является переменной для каждого ID_Articulo.

Может ли это быть с SQL-запросом? Моя база данных SQL Server 2005.

Доп Информация

Поля ID_Articulo И ID_Compenente связаны с одной и той же таблицы ARTICULOS. Вот почему данные являются рекурсивными. Таким образом, для данного примера у меня есть:

ReC#1 is not Tipo=1, but relates ID 1 with ID 5 
ReC#2 relates ID 5 with ID 3 and Tipo=1 So, I have 1.5 (of ReC#1) * 3 
ReC#3 relates ID 1 with ID 6 and Tipo=1, so i have 6 
ReC#4 is from another ID 
ReC#5 relates ID 6 with ID 8 but Tipo!=1 so i don't sum 
ReC#6 relates ID 8 and ID 9 and Tipo=1, so I have 6 * 4.2 * 2 

Окончательное решение

Это окончательный код (Некоторые имена полей различны):

;WITH CTE AS (
SELECT b.ID_Articulo, ID_Componente, Tipo, Cantidad, 
     CAST(Cantidad AS DECIMAL(6,2)) AS partialSum 
FROM Arbol b inner join articulos a on a.ID_Articulo=b.ID_Componente 
WHERE b.ID_Articulo = 2716 

UNION ALL 

SELECT t.ID_Articulo, t.ID_Componente, t.Tipo, t.Cantidad, 
     CAST(c.partialSum * t.Cantidad AS DECIMAL(6,2)) AS partialSum 
FROM (SELECT b.ID_Articulo, ID_Componente, A.Tipo, Cantidad FROM Arbol b inner join articulos a on a.ID_Articulo=b.ID_Componente inner join Articulos a2 on a2.ID_Articulo=b.ID_Articulo where a2.Tipo<>'I') as t 
INNER JOIN CTE AS c ON c.ID_Componente = t.ID_Articulo 
) 
SELECT SUM(partialSum) 
FROM CTE 
WHERE Tipo = 'I' 

Спасибо @ Йоргос-betsos для окончательное решение

+1

Я не вижу, как вы получите эту сумму для ID_Articulo = 1 и образец таблицы, которую вы предоставили. Я также не понимаю, почему это рекурсивно? – Paddy

+0

Извините. Виноват. Я редактирую вопрос, чтобы дать больше информации. – ericpap

+2

Да, почему 1.5 * 3 часть вашего уравнения? Единственный 1.5 находится в первой строке, где 'tipo' равно 2, поэтому в соответствии с описанием он не должен включаться. Ваш пример только делает ваш вопрос менее ясным. –

ответ

4

Для получения ожидаемого результата можно использовать следующий рекурсивный КТЭ:

;WITH CTE AS (
    SELECT ID_Articulo, ID_Componente, Tipo, Cantidad, 
      CAST(Cantidad AS DECIMAL(6,1)) AS partialSum 
    FROM mytable 
    WHERE ID_Articulo = 1 

    UNION ALL 

    SELECT t.ID_Articulo, t.ID_Componente, t.Tipo, t.Cantidad, 
      CAST(c.partialSum * t.Cantidad AS DECIMAL(6,1)) AS partialSum 
    FROM mytable AS t 
    INNER JOIN CTE AS c ON t.ID_Articulo = c.ID_Componente 
) 
SELECT SUM(partialSum) 
FROM CTE 
WHERE Tipo = 1 

Что выше рекурсии, является то, что он возвращает все ветви, исходящие из ID_Articulo = 1, наряду с совокупным продуктом умножения Cantidad значений:

ID_Articulo ID_Componente Tipo Cantidad partialSum 
------------------------------------------------------------------ 
1    5    2  1.5   1.5 
1    6    1  6.0   6.0 
6    8    2  4.2   25.2 
8    9    1  2.0   50.4 
5    3    1  3.0   4.5 

Результат рассчитывается с использованием SUM на partialSumтолько для тех строк, где Tipo = 1.

Demo here

+1

Ты мужчина! Как можно угадать, что требовалось? –

+1

@GiorgiNakeuri Я просто угадываю. Только ОП может проверить, является ли вышеуказанное решение его истинным намерением! –

+0

Очень близко! Я оцениваю это с помощью реальных данных и расскажу вам, как это происходит! – ericpap