2014-12-12 4 views
1

MS-SQL Server 2008 R2를 실행합니다. 다음과 비슷한 설정을 사용하는 테이블이 있습니다. 가격이 0 인 날짜가 있습니다. 그러나 이전 달의 가격을 의미하는 자리 표시자가 변경되지 않았습니다. Coalesce 나 가장 가까운 PREVIOUS 날짜의 Price-value가 0이 아닌 다른 함수를 사용할 수 있습니까?날짜 순서 목록에서 이전의 0이 아닌 값 찾기

** 항목 이름 | 날짜 | 가격 **

Item1 | 01/01/2013 | 10.00 
Item1 | 02/01/2013 | 9.50 
Item1 | 03/01/2013 | 0 
Item1 | 04/01/2013 | 9.50 
Item1 | 05/01/2013 | 8.00 
Item1 | 06/01/2013 | 8.00 
Item1 | 07/01/2013 | 6.00 
Item1 | 08/01/2013 | 6.00 
Item1 | 09/01/2013 | 0 
Item2 | 01/01/2013 | 50.00 
Item2 | 02/01/2013 | 45.00 
Item2 | 03/01/2013 | 35.00 
Item2 | 04/01/2013 | 30.00 
Item2 | 05/01/2013 | 25.00 
Item2 | 06/01/2013 | 0 
Item2 | 07/01/2013 | 10.00 
Item2 | 08/01/2013 | 0 
Item2 | 09/01/2013 | 0 

원하는 출력 ** 항목 이름 | 날짜 | 가격 여기 **

Item1 | 01/01/2013 | 10.00 
Item1 | 02/01/2013 | 9.50 
Item1 | 03/01/2013 | 9.50 
Item1 | 04/01/2013 | 9.50 
Item1 | 05/01/2013 | 8.00 
Item1 | 06/01/2013 | 8.00 
Item1 | 07/01/2013 | 6.00 
Item1 | 08/01/2013 | 6.00 
Item1 | 09/01/2013 | 6.00 
Item2 | 01/01/2013 | 50.00 
Item2 | 02/01/2013 | 45.00 
Item2 | 03/01/2013 | 35.00 
Item2 | 04/01/2013 | 30.00 
Item2 | 05/01/2013 | 25.00 
Item2 | 06/01/2013 | 25.00 
Item2 | 07/01/2013 | 10.00 
Item2 | 08/01/2013 | 10.00 
Item2 | 09/01/2013 | 10.00 
+0

아니요, 'COALESCE'는 자체적으로 여기에 도움이되지 않습니다. 이전 날짜가 항상 있습니까? 0이 될 수있는 최대 연속 행 수가 있습니까? 불행히도 이전 행에 참여할 수 없습니다. 왜냐하면이 행도 0이 될 수 있기 때문입니다. 그 전에 행에 참여해야합니다. 실제 값은 '변경'또는 절대 값입니까? 즉, 0인지 아닌지에 관계없이 누적 합계를 찾으려고합니다. –

+0

각 항목이 가격으로 시작해야하기 때문에 항목의 첫 번째 값이 0 인 시간이 없어야합니다. 따라서, 참조 될 수있는 적어도 하나의 0이 아닌 값이 항상 있어야합니다. 그러나 0 일 수있는 연속 행의 수에는 제한이 없습니다. 가격의 값 유형은 부동 소수점이며 소수점 오른쪽에 몇 가지 문자가있을 가능성이 높습니다. – user2036380

+0

값 '10 .00 '은 가격이 10으로 변경되었음을 의미합니까 아니면 가격이 _is_ 10을 의미합니까? –

답변

0

는 당신에게 샘플 테이블

SELECT * INTO #TEMP 
FROM 
(
SELECT 'Item1' [Item Name],  '01/01/2013' [Date], 10.00 [Price] 
UNION ALL 
SELECT 'Item1',  '02/01/2013', 9.50 
UNION ALL 
SELECT 'Item1',  '03/01/2013', 0 
UNION ALL 
SELECT 'Item1',  '04/01/2013', 7.50 
UNION ALL 
SELECT 'Item1',  '05/01/2013', 0.00 
UNION ALL 
SELECT 'Item1',  '06/01/2013', 0.00 
UNION ALL 
SELECT 'Item1',  '07/01/2013', 11.00 
UNION ALL 
SELECT 'Item2',  '01/01/2013', 0.00 
UNION ALL 
SELECT 'Item2',  '02/01/2013', 12.00 
UNION ALL 
SELECT 'Item2',  '03/01/2013', 0.00 
UNION ALL 
SELECT 'Item2',  '04/01/2013', 0.00 
UNION ALL 
SELECT 'Item2',  '05/01/2013', 13.00 
)TAB 

그리고 결과 쿼리입니다

SELECT [Item Name],[Date], 
CASE WHEN [Price]=0 THEN 
    ISNULL((SELECT TOP 1 [Price] 
    FROM #TEMP T2 
    WHERE CAST(T2.[Date] AS DATE)<T1.[Date] AND T1.[Item Name]=T2.[Item Name] AND T2.[Price]>0 
    ORDER BY CAST(T2.[Date] AS DATE) DESC),0) 
    ELSE [Price] END [Price] 
FROM #TEMP T1 

당신의 결과는 여기 여기

enter image description here

입니다 작동하는 바이올 http://sqlfiddle.com/#!3/afabd/1 (로드 페이지에서 오류가 발생하면 RUNSQL을 눌러 작동합니다.)

관련 문제