2013-11-02 4 views
-1

에 사용자 함수 결과를 포함 I가이 저장 기능SQL 서버 선택 쿼리

function GetPrevReading(
@utility int, 
@asofdate datetime 
) returns decimal(10,5) 

이 기능은 다음 fieds와 테이블에서 이전 검침을 반환 : 내가 사용을 선택

utility - int 
date - datetime 
reading - numeric(18,4) 

이 테이블에서 날짜를 매개 변수로 설정하여 테이블에서 가져 오려고합니다.

Utility Previous Reading 
(distinct) GetPrevReading(utility from query, @date from parameter) 

GetPrevReading 함수가 현재 행에서 '유틸리티'매개 변수를 가져 오도록합니다. 이 작업을 쿼리와 함께 수행 할 수 있습니까? 아니면 저장 프로 시저를 만들어야합니까? , 여기 제 기능을

Utility PreviousReading 
1   105.6 
2   226.1 

: 나는 2013년 10월 29일에 매개 변수 @date를 설정하면 나는이 결과를 얻어야한다, 지금

Utility Date  Reading 
1   2013-10-1 105.6 
1   2013-11-1 123.72 
2   2013-10-1 226.1 
2   2013-10-1 238.18 

:

예를 들어

이 테이블입니다 첫 번째 행에는 @ utility = 1 및 @ asofdate = '2013-10-29'가 있어야하고 두 번째 행에는 @ utility = 2 및 @ asofdate = '2013-10-29'가 있어야합니다.

+0

단일 값을 반환하는 스칼라 UDF입니까? 그리고 왜 테이블의 유틸리티가 nvarchar (20)이고 함수에 대한 입력이 int인지 기다려주십시오. –

+0

내 잘못, 유틸리티 int입니다. 나는 바뀌었고 네, UDF는 스칼라입니다 – cicatrix

+0

수치가 (18,4) 또는 소수 (10,5)입니까? –

답변

0

에 가입하여 + SQL 2005에서이 작업을 수행 할 수 있습니다. 데이터 유형에 불일치가 수정되었고 샘플 데이터의 마지막 줄에 실제로 날짜로 2013-11-01이 있어야한다고 가정했습니다. 또한, 함수가 쓰여지는 방법은 이전에 읽은 것이 아니라 해당 날짜에 읽는 것입니다.

CREATE TABLE MyTable (
    Utility Int, 
    Date Date, 
    Reading Decimal(10,5) 
); 

INSERT INTO MyTable (Utility, Date, Reading) 
VALUES 
(1,'2013-10-01', 105.60), 
(1,'2013-11-01', 123.72), 
(2,'2013-10-01', 226.10), 
(2,'2013-11-01', 238.18); 

CREATE FUNCTION dbo.GetPrevReading(
    @utility int, 
    @asofdate datetime 
) 
RETURNS Decimal(10,5) 
AS 
    BEGIN 

    RETURN (
     SELECT TOP 1 Reading 
     FROM MyTable 
     WHERE Utility = @Utility 
      AND Date = @asofdate 
     ORDER BY Date DESC 
    ) 
END; 


SELECT 
    Utility 
    ,Date 
    ,dbo.GetPrevReading(Utility, Date) 
FROM (
    SELECT Utility, Max(Date) Date 
    FROM MyTable 
    WHERE Date < '2013-10-29' 
    GROUP BY Utility 
) x; 
0

질문을 이해하고 있습니다. 이 호출에 대한 함수가 반환

GetPrevReading(1,2013-10-29) 

반환

1, 105.6 
2, 226.1 

그리고 당신은 기능과 그 결과와 기본 테이블 간의 조인 싶어? 당신은 Apply 밖으로 this을 시도

Select 
… 
From tblUtilityReadings 
Cross Apply GetPrevReading(tblUtilityReadings.utility, @date)