Мне нужен способ объединить таблицу с результатами функции. Я не уверен, возможно ли это, и почему-то я не думаю, что это хорошая идея. Позвольте мне попытаться объяснить ситуацию.
Есть таблица [Сущностей]:
[ID] [Description] [kWh] [kVArh] [kVAh] [OfferID] [CustomOfferID]
Другая таблица [Данные]:
[ID] [Timestamp] [Value]
И функция:
[Calc] (@offer, @customOffer, @kWh, @kVArh, @kVAh, @dtStart, @dtEnd)
Таким образом, вы можете видеть, что есть сущности, данные (использование) сущностей и функция для расчета стоимости.
Мне нужно отобразить использование и стоимость нескольких предметов:
[Description] [MWh] [MVA] [Cost]
[MWh]
будет суммой всех данных предприятия за период; [MVA]
будет МАКС. Всех данных за период; и [Cost]
будет СУММАТЬ поле [Cost]
из подзапроса (функция).
Запрос, который я рассчитывал выполнить, выглядит следующим образом:
SELECT [tc].[ID], [tc].[Desc]
, SUM([kWh].[Value]) / 1000 AS [MWh]
, MAX([kVAh].[Value]) / 1000 AS [MVA]
, SUM([cost].[Cost])
FROM [Tree_Cost] AS [tc]
INNER JOIN [Data] AS [kWh] ON [tc].[kWh] = [kWh].[ID]
INNER JOIN [Data] AS [kVAh] ON [tc].[kVAh] = [kVAh].[ID]
INNER JOIN
(
SELECT [tc].[ID], [Cost]
FROM [Calc] ([tc].[Offer_ID], [tc].[OfferCustom_ID], [tc].[kWh], [tc].[KVArh], [tc].[kVAh], @dtStart, @dtEnd)
) AS [cost] ON [tc].[ID] = [cost].[ID]
WHERE [tc].[Type] = 1 AND [tc].[TypeDesc] = 'GF_K_M'
AND [kWh].[Timestamp] BETWEEN @dtStart AND @dtEnd
AND [kVAh].[Timestamp] BETWEEN @dtStart AND @dtEnd
GROUP BY [tc].[ID], [tc].[Desc]
Реальная проблема здесь заключается в том, что мне нужно включить [ID]
из внешнего запроса в набор результатов внутреннего запроса (функции), чтобы иметь возможность объединить эти два. Тогда я также должен иметь возможность использовать поля из внешнего запроса в качестве аргументов для внутреннего запроса (функции).
Это явно не тот способ видеть, поскольку идентификатор [tc]
не распознается во внутреннем запросе. Так как же мне достичь чего-то подобного?
CREATE FUNCTION [dbo].[Calc]
( \@intOffer [int]
, \@intCustom [int]
, \@intP [int]
, \@intQ [int]
, \@intS [int]
, \@dtStart [datetime]
, \@dtEnd [datetime]
)
RETURNS TABLE
( [Entry] [nvarchar](200) NULL
, [Rate] [float] NULL
, [Unit] [nvarchar](50) NULL
, [Reading] [float] NULL
, [Cost] [float] NULL
, [DDate] [nvarchar](50) NULL
)
WITH EXECUTE AS CALLER
AS EXTERNAL NAME [OfferCalcLite].[UserDefinedFunctions].[SqlArray]