У меня небольшая проблема со столбцом [PortfelID]. Мне нужен его идентификатор, чтобы иметь возможность использовать его в функции, которая будет возвращать мне имя типа стратегии для каждого клиента. Однако, делая это, мне нужно поместить [PortfelID] в GroupBy
, что значительно усложняет результаты.
Я ищу способ найти тип стратегии и сумму денег, которые есть в этой стратегии. Однако, если я использую Group By [PortfelID]
, я получаю несколько записей для каждой стратегии. На самом деле более 700 строк (потому что есть 700 значений [PortfelID]). И все, что я хочу, это всего лишь 1 стратегия и сумма [WycenaWartosc] для этой стратегии. Таким образом, в общей сложности я бы получил 15 строк или около того
Есть ли способ использовать эту функцию, не добавляя [PortfelID] в 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]
Где [dbo]. [Ufn_TypStrategiiDlaPortfelaDlaDaty] определяется следующим образом:
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:
Согласно предложению (Рупеш Маджети) я сделал что-то вроде этого:
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
Но это кажется немного излишним и требует слишком много ручной работы. Решение AlexS, кажется, делает именно то, что мне нужно: -)