2011-03-04 38 views
1

我有2個表值函數是非常相似的,唯一的區別是,我需要一個額外的Max()調用第二個。我想將它們合併成一個,但我不知道如何去做。如果聲明在表中的值函數

第一個功能

ALTER FUNCTION [DayTrade].[udf_GetTotalLast90Days] 
( 
    @Date  datetime 
) 
RETURNS TABLE 
AS 
RETURN 
(
    SELECT Acct, Sum(AGGCnt) As AGGCnt, AGGNumb 
    FROM  DT.vwGet_CountHist 
    WHERE (PostDate >= @Date - 90) AND (PostDate <= @Date) 
    GROUP BY Acct, AGGNumb 
) 

二功能

ALTER FUNCTION [DayTrade].[udf_GetTotalLast90Days] 
( 
    @Date  datetime 
) 
RETURNS TABLE 
AS 
RETURN 
(
    SELECT  Acct, Sum(AGGCnt) As AGGCnt, Max(AGGNumb) As AGGNumb 
    FROM  DT.vwGet_CountHist 
    WHERE (PostDate >= @Date - 90) AND (PostDate <= @Date) 
    GROUP BY Acct 
) 

正如你所看到的第二個區別是我加入Max(AGGNumb) As AGGNumb和去除分組依據之一。我試圖改變這一點,並通過一個額外的變量@Agg這是一個位字段,然後使用IF statement來選擇使用哪個函數,但我無法讓它工作。

有關如何將這兩個函數合併爲1的任何建議?

感謝

回答

4

一個參數將爲NULL,所以WHERE僅針對一個子句失敗。

ALTER FUNCTION [DayTrade].[udf_GetTotalLast90Days] 
( 
    @Date  datetime = NULL, 
    @BusinessDate = NULL 
) 
RETURNS TABLE AS RETURN 
(
    SELECT Acct, Sum(AGGCnt) As AGGCnt, AGGNumb 
    FROM  DT.vwGet_CountHist 
    WHERE (PostDate >= @Date - 90) AND (PostDate <= @Date) 
    GROUP BY Acct, AGGNumb 
    UNION ALL 
    SELECT  Acct, Sum(AGGCnt) As AGGCnt, Max(AGGNumb) As AGGNumb 
    FROM  DT.vwGet_CountHist 
    WHERE (PostDate >= @BusinessDate - 90) AND (PostDate <= @BusinessDate) 
    GROUP BY Acct 
) 
+0

我更新了上面的代碼,它在兩個where子句中都是@Date而不是@businessDate,這是否有所作爲? – Taryn 2011-03-04 20:28:57

+0

+1。看起來比我的方法好 – Simon 2011-03-04 20:30:26

+0

@bluefeet:你仍然需要一個控制變量來決定運行哪個查詢。你可能有2個參數來控制這個 – gbn 2011-03-04 20:32:27

0

你可以通過一個控制參數,像這樣(未經測試)功能

編輯:加入嵌套的SELECT

ALTER FUNCTION [DayTrade].[udf_GetTotalLast90Days] 
    (  @Date  datetime, @GetMax tinyint) 
    RETURNS TABLE AS RETURN 
    ( SELECT  Acct, Sum(AGGCnt) As AGGCnt, 
    CASE @GetMax = 1 THEN (SELECT Max(AGGNumb) FROM DT.vwGet_CountList WHERE (...)GROUP BY Max(aGGNumb)) 
ELSE (SELECT AGGNumb FROM DT.vwGet_CountList WHERE (...)) AS AGGNum END 
     FROM  DT.vwGet_CountHist  
     WHERE (PostDate >= @BusinessDate - 90) AND (PostDate <= @BusinessDate)  
     GROUP BY Acct) 

如果不工作,那麼你可能需要實現兩個SELECT分開,但在相同的程序 - 我知道並不真正解決問題,但它只需要1個程序。

+0

做這樣的說法,我得到一個錯誤約沒有在GROUP BY的AGGNumb。當我不使用Max()時,我只需要在Group By中使用它。 – Taryn 2011-03-04 20:21:48

+0

它不是最有效的方式使用嵌套選擇 – Simon 2011-03-04 20:28:44

+0

這就是我想要做的,是實現它們都在同一個函數,但我不知道如何做到這一點。 – Taryn 2011-03-04 20:30:13

0

我想,這應該工作:

ALTER FUNCTION [DayTrade].[udf_GetTotalLast90Days] 
( 
    @Date  datetime, 
    @Agg  bit 
) 
RETURNS TABLE 
AS 
RETURN 
(
    SELECT Acct, Sum(AGGCnt) As AGGCnt, MAX(AGGNumb) AS AGGNumb 
    FROM  DT.vwGet_CountHist 
    WHERE (PostDate >= @Date - 90) AND (PostDate <= @Date) 
    GROUP BY Acct, AGGNumb * (1 - @Agg) 
) 

@Agg = 1,它會按Acct只有當@Agg = 0,然後通過Acct, AGGNumb

1

這似乎是有效的:

CREATE FUNCTION DayTrade.udf_GetTotalLast90Days 
     ( 
     @Date  DATE, 
     @Summary BIT 
     ) 
RETURNS 
TABLE 
AS 
RETURN SELECT Acct, 
       AGGCnt = SUM(AGGCnt), 
       AGGNumb = MAX(AGGNumb) 
     FROM DT.vwGet_CountHist 
     WHERE PostDate BETWEEN DATEADD(DAY, -90, @Date) AND @Date 
     GROUP BY 
       GROUPING SETS ((Acct), (Acct, AGGNumb)) 
     HAVING GROUPING_ID(AGGNumb) = @Summary 
     ; 
GO