Коррелированное соединение с внешними полями в качестве параметров - PullRequest
0 голосов
/ 11 августа 2011

Мне нужен способ объединить таблицу с результатами функции. Я не уверен, возможно ли это, и почему-то я не думаю, что это хорошая идея. Позвольте мне попытаться объяснить ситуацию.

Есть таблица [Сущностей]:

[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]

1 Ответ

0 голосов
/ 11 августа 2011

Я не уверен, что правильно понимаю. Возможно, вы можете полностью сбросить JOIN:

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]

и изменить:

, SUM([cost].[Cost])

в

, SUM( [Calc] ( [tc].[Offer_ID]
              , [tc].[OfferCustom_ID]
              , [tc].[kWh]
              , [tc].[KVArh]
              , [tc].[kVAh]
              , @dtStart, @dtEnd
              )
     ) AS Cost
...