2011-03-04 7 views
1

매우 비슷한 두 개의 테이블 반환 함수가 있습니다. 유일한 차이점은 두 번째 호출에서 Max() 호출이 하나 더 필요하다는 것입니다. 나는 이것들을 하나에 통합하고 싶지만 그것을하는 방법을 이해할 수 없다.테이블에있는 문이 값이있는 함수 인 경우

첫 번째 함수는 두 번째의 차이 나는 Max(AGGNumb) As AGGNumb를 추가하고 그룹 총격 사건 중 하나를 제거하고있다 볼 수 있듯이

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 
) 

. 나는 이것을 바꾸고 추가 변수 @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

위의 코드를 업데이트했습니다. @bateDate가 아닌 where 절에 @Date가 있는데, 그 차이가 있습니까? – Taryn

+0

+1. 내 방법보다 낫다. – Simon

+0

@bluefeet : 어떤 쿼리를 실행할지 결정하기 위해서는 컨트롤 변수가 필요하다. 당신은 이것을 제어 할 수있는 2 개의 매개 변수를 가질 수도 있습니다. – gbn

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는 따로 따로 있지만 동일한 절차에서 - 나는 정말로 문제를 해결하지 못한다.하지만 단 하나의 절차 만 필요하다.

+0

그런 식으로 이렇게, 나는 그룹으로의 AGGNumb을 가지고 있지 대한 오류가 발생합니다. Max()를 사용하지 않을 때 Group By에서만 필요합니다. – Taryn

+0

그 중첩 된 선택 – Simon

+0

을 사용하여 가장 효율적인 방법은 그게 내가 뭘하려고했다, 둘 다 같은 기능에 그들을 구현했지만 그 방법을 알아낼 수 없습니다. – Taryn

0

나는이 일을해야 생각 :

@Agg = 1
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) 
) 

, 그것은 것입니다 그룹에 의해 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 
관련 문제