2010-11-07 76 views
0

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

我正在寻找一种方法来找到这种策略的战略类型和金钱总和。但是,如果我使用Group By [PortfelID],我会为每个策略获取多个条目。实际上超过700行(因为有700个[PortfelID]值)。我想要的只是1策略和[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解决方案似乎正是我所需要的:-)

回答

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] 

所以基本上(只要你通过[DBO]输出需要组。[ufn_TypStrategiiDlaPortfelaDlaDaty])无需按PortfelID。

虽然这个查询不是最优的。如果PortfelID和WycenaData不在[KlienciPortfeleKonta]表中,Join可以推送到外部查询。

更新:修正了选择列表和聚合功能的应用

+0

如果我离开'[PortfelID]'没有GROUP BY - >'消息8120,级别16,状态1,行16 列'KlienciPortfeleKonta.PortfelID'在选择列表中是无效的,因为它不包含在聚合函数中或GROUP BY子句。 ' – MadBoy 2010-11-07 18:10:41

+0

如果我添加GROUP BY [PortfelID])作为Q'因为它不包含在聚合函数或GROUP BY子句中,所以'Column'Q.Wycena'在选择列表中无效。“# – MadBoy 2010-11-07 18:11:35

+0

对不起为此 - 看起来我忘了修复选择列表/聚合。更新了我的答案。 HTH。 – AlexS 2010-11-07 18:34:46

0

如何在sql中使用“Case”语句? 检查下面的链接,例如: http://www.1keydata.com/sql/sql-case.html

希望这会有所帮助。

+0

我知道case语句只是不明白我怎么会在这里使用它?或者我错过了什么? – MadBoy 2010-11-07 17:48:16

+0

查看此weblink以获取更合适的语法示例:http://weblogs.asp.net/wilczynski/archive/2008/06/03/sum-case-in-sql.aspx – 2010-11-07 17:52:26

+0

只需添加..您可以使用您的profile_ID在每个“案例”下并且总结到另一个领域。希望这可以帮助。如果没有,让我知道..可以尝试帮助你更多。 – 2010-11-07 17:53:53