2010-11-07 72 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