Проблема с запросом выбора SQL - PullRequest
0 голосов
/ 07 ноября 2010

У меня небольшая проблема со столбцом [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, кажется, делает именно то, что мне нужно: -)

Ответы [ 2 ]

1 голос
/ 07 ноября 2010

Вот идея, как вы можете это сделать.

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]

Так что в принципе нет необходимости группировать по PortfelID (как только вам нужно сгруппировать по выходным данным [dbo]. [Ufn_TypStrategiiDlaPortfelaDlaDaty]).

Однако этот запрос не является оптимальным.Присоединение может быть передано во внешний запрос, если PortfelID и WycenaData отсутствуют в таблице [KlienciPortfeleKonta].

UPDATE: исправлен список выбора и приложение функции агрегирования

0 голосов
/ 07 ноября 2010

Как насчет использования оператора "Case" в sql?Проверьте ссылку ниже, например: http://www.1keydata.com/sql/sql-case.html

Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...