sql select query的问题

时间:2010-11-07 17:41:20

标签: sql sql-server-2005

我在[PortfelID]专栏中遇到了一些问题。我需要它的ID才能在函数中使用它,这将返回我关于每个客户端的策略类型的名称。但是,通过这样做,我需要将[PortfelID]放在GroupBy中,这会使结果复杂化。

我正在寻找一种方法来找到这种策略所具有的战略类型和资金总额。但是,如果我使用Group By [PortfelID],我会为每个策略获得多个条目。实际上超过700行(因为有700 [PortfelID]值)。而我想要的只是这个策略的一个策略和[WycenaWartosc]的总和。总的来说,我会得到15行左右

有没有办法使用该功能而无需在Group By中添加[PortfelID]?

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

编辑:

根据建议(Roopesh Majeti)我做了这样的事情:

  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 个答案:

答案 0 :(得分:1)

以下是关于如何做到这一点的想法。

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]表中,则可以将Join推送到外部查询。

更新:修复选择列表和聚合功能应用程序

答案 1 :(得分:0)

在sql中使用“Case”语句怎么样? 请查看以下链接,例如: http://www.1keydata.com/sql/sql-case.html

希望这有帮助。