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 :-)
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
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
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