2010-11-07 9 views
0

J'ai un petit problème avec la colonne [PortfelID]. J'ai besoin de son identifiant pour pouvoir l'utiliser en fonction qui me retournera le nom de Type de Stratégie par client. Cependant, en faisant cela, je dois mettre [PortfelID] dans GroupBy ce qui complique beaucoup les résultats.Problème avec la requête select sql

Je cherche un moyen de trouver le type de stratégie et la somme d'argent de cette stratégie. Cependant, si j'utilise Group By [PortfelID], je reçois plusieurs entrées pour chaque stratégie. En fait plus de 700 lignes (car il y a 700 valeurs [PortfelID]). Et tout ce que je veux, c'est juste 1 stratégie et la somme de [WycenaWartosc] pour cette stratégie. Donc au total j'obtiendrais 15 lignes ou plus

Y at-il un moyen d'utiliser cette fonction sans avoir à ajouter [PortfelID] dans Group By?

DECLARE @data DateTime 
SET @data = '20100930' 

SELECT [dbo].[ufn_TypStrategiiDlaPortfelaDlaDaty] ([PortfelID], @data) 
     ,SUM([WycenaWartosc]) AS 'Wycena' 
    FROM[dbo].[Wycena] 
    LEFT JOIN [KlienciPortfeleKonta] 
    ON [Wycena].[KlienciPortfeleKontaID] = [KlienciPortfeleKonta].[KlienciPortfeleKontaID] 
    WHERE [WycenaData] = @data 
    GROUP BY [PortfelID] 

Où [dbo] [ufn_TypStrategiiDlaPortfelaDlaDaty] est défini comme suit:.

ALTER FUNCTION [dbo].[ufn_TypStrategiiDlaPortfelaDlaDaty] 
    (
     @portfelID INT, 
     @data DATETIME 
    ) 
RETURNS NVARCHAR(MAX) 
AS BEGIN 
    RETURN (SELECT TOP 1 
        [TypyStrategiiNazwa] 
      FROM [dbo].[KlienciPortfeleUmowy] 
        INNER JOIN [dbo].[TypyStrategii] 
        ON dbo.KlienciPortfeleUmowy.TypyStrategiiID = dbo.TypyStrategii.TypyStrategiiID 
      WHERE [PortfelID] = @portfelID 
        AND ([KlienciUmowyDataPoczatkowa] <= @data 
          AND ([KlienciUmowyDataKoncowa] >= @data 
          OR KlienciUmowyDataKoncowa IS NULL) 
         ) 
      ORDER BY [KlienciUmowyID] ASC 
      ) 

    end 

EDIT:

Comme par suggestion (Roopesh Majeti) Je l'ai fait quelque chose comme ceci:

SELECT SUM(CASE WHEN [dbo].[ufn_TypStrategiiDlaPortfelaDlaDaty] ([PortfelID], @data) = 'portfel energetyka' THEN [WycenaWartosc] ELSE 0 END) AS 'Strategy 1' 
,SUM(CASE WHEN [dbo].[ufn_TypStrategiiDlaPortfelaDlaDaty] ([PortfelID], @data) = 'banków niepublicznych' THEN [WycenaWartosc] ELSE 0 END) AS 'Strategy 2' 
    FROM [dbo].[Wycena] 
    LEFT JOIN [KlienciPortfeleKonta] 
    ON [Wycena].[KlienciPortfeleKontaID] = [KlienciPortfeleKonta].[KlienciPortfeleKontaID] 
    WHERE [WycenaData] = @data 

Mais cela semble un peu exagéré et un peu trop de travail manuel est nécessaire. La solution AlexS semble faire exactement ce dont j'ai besoin :-)

Répondre

1

Voici une idée de comment vous pouvez faire cela.

DECLARE @data DateTime 
SET @data = '20100930' 

SELECT 
    TypID, 
    SUM([WycenaWartosc]) AS 'Wycena' 
FROM 
(
    SELECT [dbo].[ufn_TypStrategiiDlaPortfelaDlaDaty] ([PortfelID], @data) as TypID 
    ,[WycenaWartosc] 
    FROM[dbo].[Wycena] 
    LEFT JOIN [KlienciPortfeleKonta] 
    ON [Wycena].[KlienciPortfeleKontaID] = [KlienciPortfeleKonta].[KlienciPortfeleKontaID] 
    WHERE [WycenaData] = @data 
) as Q 
GROUP BY [TypID] 

Donc, fondamentalement, il n'y a pas besoin de regrouper par PortfelID (dès que vous avez besoin de groupe par la sortie de [dbo]. [Ufn_TypStrategiiDlaPortfelaDlaDaty]).

Cette requête n'est cependant pas optimale. Join peut être poussé vers la requête externe dans le cas où PortfelID et WycenaData ne sont pas dans la table [KlienciPortfeleKonta].

MISE À JOUR: liste de sélection fixe et l'application de la fonction d'agrégation

+0

Si je laisse '[PortfelID]' sans GROUP BY -> 'Msg 8120, Niveau 16, État 1, Ligne 16 La colonne 'KlienciPortfeleKonta.PortfelID' est invalide dans la liste de sélection car elle n'est pas contenue dans une fonction d'agrégat ou la clause GROUP BY. ' – MadBoy

+0

SI j'ajoute dedans' GROUP BY [PortfelID]) comme Q' je reçois 'Column 'Q.Wycena' est invalide dans la liste de sélection car il n'est pas contenu dans une fonction d'agrégat ou la clause GROUP BY.' – MadBoy

+0

Désolé pour cela - on dirait que j'ai oublié de corriger la liste de sélection/l'agrégation. Mise à jour ma réponse HTH. – AlexS

0

Comment utiliser l'instruction "Case" en SQL? Vérifiez le lien ci-dessous par exemple: http://www.1keydata.com/sql/sql-case.html

Espérons que cela aide.

+0

Je sais à propos ÉNONCÉ DE CAS ne vois pas comment je pourrais l'utiliser ici? Ou est-ce que je manque quelque chose? – MadBoy

+0

Vérifiez ce lien pour l'exemple de syntaxe plus approprié: http://weblogs.asp.net/wilczynski/archive/2008/06/03/sum-case-in-sql.aspx –

+0

Juste pour ajouter .. Vous pouvez utiliser votre profil_ID sous chaque "cas" et sommation dans un autre champ. J'espère que cela t'aides. Si non, laissez-moi savoir .. peut essayer de vous aider plus. –