У меня следующая проблема:
В настоящее время у меня есть хранимая процедура, и когда я ввожу 4 различных параметра, выполняется много вычислений, а затем оператор SELECT для вывода результатов (11 столбцов), например:
Начало этого запроса выглядит следующим образом:
ALTER PROCEDURE [AGG].[usp_CalculateIsentropeEfficiency]
(
@InlaatdrukE INT,
@InlaattempC INT,
@UitlaatdrukE INT,
@UitlaattempC INT
)
AS
/*-------------------------- Omrekenen van druk naar absolute druk en temperatuur naar de eenheid Kelvin. --------------------------*/
DECLARE @InlaatdrukA DECIMAL(20,15)
DECLARE @InlaattempK DECIMAL(20,15)
DECLARE @UitlaatdrukA DECIMAL(20,15)
DECLARE @UitlaattempK DECIMAL(20,15)
SET @InlaatdrukA = @InlaatdrukE + 1.01325
SET @InlaattempK = @InlaattempC + 273.15
SET @uitlaatdrukA = @UitlaatdrukE + 1.01325
SET @UitlaattempK = @UitlaattempC + 273.15
После этой части я объявляю и устанавливаю еще пару переменные. Некоторые ищут значения в справочной таблице, а некоторые просто простые вычисления.
1014 * Идея теперь, что эти различные параметры должны быть заполнены в соответствии с другим отборным заявлением я сделал с шарниром.
Вывод этой сводной таблицы выглядит следующим образом:
Где PI,PU,TI
и TU
- входы для хранимая процедура.
Моя проблема в том, что я не могу запустить хранимую процедуру для каждой строки, поэтому я подумал вставить Pivot Select в хранимую процедуру, чтобы создать таблицу большего размера. Это также не работает, так как я не могу использовать сводную таблицу в качестве входных данных для переменных, с которыми я выполняю вычисления.
Требуемый вывод должен быть сводной таблицей + вычисления. как это:
TimeKey Component PI PU TI TU Q Row# InlaatdrukA InlaattempK Tuit_s
, et c.
Я надеюсь, что любой из вас знает, как это сделать лучше всего, так как я считаю, что хранимая процедура может быть не лучшим вариантом.
Спасибо, что поделились своим опытом.
Как указано в комментариях, здесь есть еще SQL код с логикой c: В процедуре:
--Inlaat
DECLARE @Lookup_inlaat_templower INT
DECLARE @Lookup_inlaat_druklower INT
DECLARE @Lookup_inlaat_temphigher INT
DECLARE @Lookup_inlaat_drukhigher INT
SET @Lookup_inlaat_templower = (SELECT MAX(ref.Temperature) FROM AGG.tblRefIsentropeEfficiency ref WHERE ref.Temperature <= @InlaattempK)
SET @Lookup_inlaat_druklower = (SELECT MAX(ref.Pressure) FROM AGG.tblRefIsentropeEfficiency ref WHERE ref.Pressure <= @InlaatdrukA)
SET @Lookup_inlaat_temphigher = (SELECT MIN(ref.Temperature) FROM AGG.tblRefIsentropeEfficiency ref WHERE ref.Temperature >= @InlaattempK)
SET @Lookup_inlaat_drukhigher = (SELECT MIN(ref.Pressure) FROM AGG.tblRefIsentropeEfficiency ref WHERE ref.Pressure >= @InlaatdrukA)
--Uitlaat
DECLARE @Lookup_uitlaat_templower INT
DECLARE @Lookup_uitlaat_druklower INT
DECLARE @Lookup_uitlaat_temphigher INT
DECLARE @Lookup_uitlaat_drukhigher INT
SET @Lookup_uitlaat_templower = (SELECT MAX(ref.Temperature) FROM AGG.tblRefIsentropeEfficiency ref WHERE ref.Temperature <= @uitlaattempK)
SET @Lookup_uitlaat_druklower = (SELECT MAX(ref.Pressure) FROM AGG.tblRefIsentropeEfficiency ref WHERE ref.Pressure <= @uitlaatdrukA)
SET @Lookup_uitlaat_temphigher = (SELECT MIN(ref.Temperature) FROM AGG.tblRefIsentropeEfficiency ref WHERE ref.Temperature >= @uitlaattempK)
SET @Lookup_uitlaat_drukhigher = (SELECT MIN(ref.Pressure) FROM AGG.tblRefIsentropeEfficiency ref WHERE ref.Pressure >= @uitlaatdrukA)
/*-------------------------- Interpolatie van de gemeten inlaat temperatuur en druk. --------------------------*/
DECLARE @Isentrope_inlaat_lowertemp_lowerdruk DECIMAL(19,17)
DECLARE @Isentrope_inlaat_lowertemp_higherdruk DECIMAL(19,17)
DECLARE @Isentrope_inlaat_highertemp_lowerdruk DECIMAL(19,17)
DECLARE @Isentrope_inlaat_highertemp_higherdruk DECIMAL(19,17)
SET @Isentrope_inlaat_lowertemp_lowerdruk = (SELECT ref.IsentropeCoefficient FROM AGG.tblRefIsentropeEfficiency ref WHERE ref.Temperature = @lookup_inlaat_templower AND ref.Pressure = @lookup_inlaat_druklower)
SET @Isentrope_inlaat_lowertemp_higherdruk = (SELECT ref.IsentropeCoefficient FROM AGG.tblRefIsentropeEfficiency ref WHERE ref.Temperature = @lookup_inlaat_templower AND ref.Pressure = @lookup_inlaat_drukhigher)
SET @Isentrope_inlaat_highertemp_lowerdruk = (SELECT ref.IsentropeCoefficient FROM AGG.tblRefIsentropeEfficiency ref WHERE ref.Temperature = @lookup_inlaat_temphigher AND ref.Pressure = @lookup_inlaat_druklower)
SET @Isentrope_inlaat_highertemp_higherdruk = (SELECT ref.IsentropeCoefficient FROM AGG.tblRefIsentropeEfficiency ref WHERE ref.Temperature = @lookup_inlaat_temphigher AND ref.Pressure = @lookup_inlaat_drukhigher)
DECLARE @IsentropeInlaatG1 DECIMAL(19,17)
DECLARE @IsentropeInlaatG2 DECIMAL(19,17)
SET @IsentropeInlaatG1 = ((@lookup_inlaat_druklower + @Deltax - @InlaatdrukA) * @Isentrope_inlaat_lowertemp_lowerdruk + (@InlaatdrukA - @lookup_inlaat_druklower) * @isentrope_inlaat_lowertemp_higherdruk) / @deltax
SET @IsentropeInlaatG2 = ((@lookup_inlaat_druklower + @Deltax - @InlaatdrukA) * @Isentrope_inlaat_highertemp_lowerdruk + (@InlaatdrukA - @lookup_inlaat_druklower) * @isentrope_inlaat_highertemp_higherdruk) / @deltax
Это просто установка переменных и выполнение расчетов с ними. (это еще не все, но должно дать более глубокое понимание того, как я вычисляю поля. Окончание atm хранимой процедуры просто:
SELECT InlaatdrukA = @InlaatdrukA,
InlaattempK = @InlaattempK,
UitlaatdrukA = @UitlaatdrukA,
UitlaattempK = @UitlaattempK,
Interpolate_BL = @InlaatInterpolate_BL,
Tuit_s = @Tuit_s,
H1_Interpolate_BL = @H1_Interpolate_BL,
H2_Interpolate_BL = @H2_Interpolate_BL,
H2s_Interpolate_BL = @H2s_Interpolate_BL,
IsentropeEfficiency = @IsentropeEfficiency,
IsentropeInefficiency = @IsentropeInefficiency
И весь запрос Pivot SQL выглядит так:
with cte_src as (
SELECT
VH.Value,
VH.TimeKey,
RIGHT(M.MeasurementOriginalName, CHARINDEX('.', REVERSE(M.MeasurementOriginalName))-1) AS Type,
SUBSTRING(M.MeasurementOriginalName, charindex('.', M.MeasurementOriginalName, charindex('.', M.MeasurementOriginalName, charindex('.', M.MeasurementOriginalName, charindex('.', M.MeasurementOriginalName, 1))+1)+1)+1,charindex('.', M.MeasurementOriginalName, charindex('.', M.MeasurementOriginalName, charindex('.', M.MeasurementOriginalName, charindex('.', M.MeasurementOriginalName, charindex('.', M.MeasurementOriginalName, 1))+1)+1)+1) - charindex('.', M.MeasurementOriginalName, charindex('.', M.MeasurementOriginalName, charindex('.', M.MeasurementOriginalName, charindex('.', M.MeasurementOriginalName, 1))+1)+1)-1) as Component
FROM [MSTR].[tblDimMeasurement] M
INNER JOIN [AGG].[tblTmpFactMeasurementAnalogueValueHour] VH ON VH.MeasurementKey = M.MeasurementKey
WHERE M.MeasurementOriginalName LIKE ('%A-414-C014%')
and RIGHT(M.MeasurementOriginalName,2) IN ('PU','PI','TI','TU','.Q') ),
cte_piv as(
select *, ROW_NUMBER() OVER (ORDER BY TimeKey) as Row# from cte_src
PIVOT( MAX(Value) FOR TYPE IN ([PI],[PU],[TI],[TU],[Q]) )Pivotname
)
Select * from cte_piv
здесь я выбираю поля, которые мне нужны, и с помощью charindex я проверяю, получаю ли я правильную часть строки.
Затем поворачивайте ее, чтобы получить результат с помощью PI, PU
et c как показано выше.