2011-08-11 2 views
0

J'ai besoin d'un moyen pour joindre une table avec les résultats d'une fonction. Je ne suis pas sûr que ce soit possible et je ne pense pas que ce soit une bonne idée. Laissez-moi essayer et expliquer la situation.Jointure corrélée avec les champs externes en tant que paramètres

Il y a une table [entités]:

[ID] [Description] [kWh] [kVArh] [kVAh] [OfferID] [CustomOfferID] 

Une autre table [Data]:

[ID] [Timestamp] [Value] 

Et une fonction:

[Calc] (@offer, @customOffer, @kWh, @kVArh, @kVAh, @dtStart, @dtEnd) 

Vous pouvez voir qu'il ya des entités , les données des entités (utilisation) et une fonction pour calculer le coût.

Je dois montrer l'utilisation et le coût de plusieurs ENTITES:

[Description] [MWh] [MVA] [Cost] 

[MWh] sera une somme de toutes les données de l'entité au cours de la période; [MVA] sera le MAX de toutes les données sur la période; et [Cost] SUM le champ [Cost] de la sous-requête (fonction).

La requête que je pensais ferait les emplois ressemble à ceci:

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] 

Le vrai problème est ici que je dois inclure la [ID] de la requête externe dans le jeu de résultats de la requête interne (fonction) afin de pouvoir rejoindre les deux. Ensuite, je dois également pouvoir utiliser les champs de la requête externe comme arguments pour la requête interne (fonction).

Ce n'est évidemment pas le cas car l'identificateur [tc] n'est pas reconnu dans la requête interne. Alors, comment suis-je censé accomplir quelque chose comme ça?


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] 
+0

Qu'est-ce '[Calc]'? –

+0

@ypercube: "Et une fonction:' [Calc] (@offer, @customOffer, @kWh, @kVArh, @kVAh, @dtStart, @dtEnd) '" – Jacob

+0

@cularis: J'essaie de comprendre où cette la fonction est utilisée. @ that0th3rGuy: Est-il utilisé pour calculer '[Cost]'? –

Répondre

0

Je ne suis pas sûr que je comprends bien. Peut-être que vous pouvez complètement laisser tomber le REJOIGNEZ:

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] 

et changement:

, SUM([cost].[Cost]) 

dans:

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

Thanx pour répondre. Je m'excuse de ne pas commencer à effacer précédemment. la fonction '[Calc]' retourne un ensemble de résultats avec plusieurs colonnes donc j'ai modifié votre suggestion comme suit: ', (SELECT SUM ([Coût]) AS [Coût] FROM [Calc] (...)) AS [Coût] 'même s'il a produit une erreur:" ... n'a pas pu produire un plan de requête. "; Je vais essayer de voir ce que je peux trouver sur cette erreur. encore merci. – that0th3rGuy

+0

je reçois "syntaxe incorrecte". est 'SELECT SUM ( ({arguments}))' où ' ({arguments})' renvoie plusieurs colonnes valides? n'ai-je pas besoin de spécifier la colonne pour faire la somme? – that0th3rGuy

+0

OK, si vous pouvez faire une autre fonction (par exemple, 'CalcCost') qui ne renvoie qu'un seul résultat, alors vous pouvez utiliser ma suggestion. –

Questions connexes