SQL Server Query со сложными вычислениями для каждой строки

Вот такая ситуация.
таблица a
кола1 кола2

таблица b
colb1 colb2 colb3 colb4 colb5

таблица c
colc1 colc2 colc3

для каждого значения cola2 = colb1 и colb4 = colc12, выборка colb2
для каждого значения cola2 = colb1 и colb5 = colc3, выборка colb3

вычислить (colb3- colb2) * размер * factor1 для каждого столбца cola2.
Вычислить SUM((colb3- colb2) * размер * factor1) для каждого столбца cola2
Вычислить AVG((colb3- colb2) * размер * factor1) для каждая кола2

значение (colb3- colb2) * size * factor1 также необходимо хранить в таблице для других вычислений. Я попытался использовать определяемую пользователем функцию с табличным значением из нескольких операторов. Но невозможно вернуть как совокупные значения, так и отдельные значения в одной таблице. Как мне использовать несколько UDF в одном запросе на соединение? Есть ли какие-либо другие функции, которые я могу использовать?

Пример данных: таблица a
id1 prod1

таблица b
id1 datefrom dateto id1 id2
id2 datefrom dateto id3 id4

table c < br/> цена даты id1
цена даты id2
цена даты id3
цена даты id4
таблица b(id1) соответствует таблице c(id1)
таблица b(id2 ) соответствует таблице c(id2)

Мне нужно получить цену из таблицы c для обоих идентификаторов в таблице b, чтобы я мог вычесть значения и найти сумму результатов. Цените любую помощь.


person Techspirit    schedule 23.07.2009    source источник
comment
Вам не хватает важной информации. Для начала, как таблица c связана с другими таблицами?   -  person Tomalak    schedule 23.07.2009
comment
таблица b(colb4, colb5) имеет отношение внешнего ключа к таблице c (colc2, colc3)   -  person Techspirit    schedule 23.07.2009


Ответы (1)


Почему вы не можете сделать это с помощью простых операторов SQL? не вижу здесь ничего сложного

select cola2, 
CASE WHEN cola2 = colb1 AND colb4 = colc12 THEN colb2 ELSE NULL END as Calculation1, 
CASE WHEN cola2 = colb1 AND colb5 = colc3 THEN colb3 ELSE NULL END AS Calculation2,
 (colb3 - colb2) * size * factor1 as Calculation3, <...>
INTO #intermediate
FROM tablea 
INNER JOIN tableb ON <...>
INNER JOIN tablec ON <...>

SELECT SUM(Calculation3) as SumCalculation3, AVG(Calculation3) as AvgCalculation3
FROM #intermediate

Если, конечно... в вашей проблеме нет дополнительных частей, которые вы упустили. Но в целом использование промежуточных таблиц — это нормально, и часто это самый быстрый способ обработки таких сложных вычислений. Попытка собрать все это в один SQL SELECT просто требует кошмара обслуживания.

person hova    schedule 23.07.2009
comment
Спасибо. Я нахожу вашу идею очень полезной. если бы я соединил таблицу b и таблицу c на столбцах colb4 = colc12 , fetch colb3 и на colb5 = colc2, fetch colb3, как бы я назначил условие условия? - person Techspirit; 23.07.2009