2016-06-13 5 views
0

나는 역사적 재고 기록에서 주식의 움직임 파일을 만들려고 해요, 포토 볼 주식의 움직임 :SQL, 더 영 재고 기록

http://i.stack.imgur.com/tDJI2.png

나는 녹색 운동을 얻을 수있었습니다을하고 오렌지 값 (max(day) + 1에 대한 0 주식 기록에 일부 운합이 있었고 오늘보다 적은 양을 제거함). 그런 다음 지연 기능을 사용하여 동작을 생성합니다.

어려움은 0 주식 기록이 없습니다. 즉 위의 예에서 다섯 번째 행은 아무런 레코드도 없으므로 -2로 올바른 이동을 0으로 만들 수 없습니다. 그것은 -10, -4, -5, -3, -1, -3의 움직임을 만들어 낼 것입니다.

갭을 확인하고 팬텀 0을 만드는 더 쉬운 방법이 있습니까? 매일 같이 될 주간 혼합)?

답변

0

누락 된 간격을 얻으려면 몇 가지 방법이 있습니다. 매주 (또는 7 일) 날짜가 있고 경우에 따라 날짜가없는 것처럼 보입니다. 따라서 while 루프를 사용하여 날짜 테이블을 만들고 조인을 수행하고 테이블에서 null이있을 때 Stock Opening Balance를 0으로 설정하면됩니다. 여기에 비슷한 테이블 변수를 사용하고 있습니다.하지만 임시 테이블을 사용하는 것이 더 나을 것입니다. 만약 당신이 2 테이블을 필요로하지 않는다면 임시 테이블에 누락을 삽입하십시오.

DECLARE @TableWithGaps AS TABLE ([Date] DATE, StockOpeningBalance INT) 
INSERT INTO @TableWithGaps ([Date],StockOpeningBalance) 
    VALUES ('2016-04-04',10) 
,('2016-04-11',6) 
,('2016-04-18',2) 
,('2016-05-09',7) 
,('2016-05-16',4) 
,('2016-05-23',3) 

DECLARE @Dates AS TABLE ([Date] DATE) 

DECLARE @MinDate DATE = '3/28/2016' 
DECLARE @MaxDate DATE = '6/20/2016' 

--Could also get first record as minimum date and last record, or set @maxdate = GETDATE() 
--SELECT @MinDate = DATEADD(DAY,7,MIN([Date])), @MaxDate = MAX([Date]) FROM @TableWithGaps 

WHILE @MinDate < DATEADD(DAY,1,@MaxDate) 
BEGIN 

    INSERT INTO @Dates ([Date]) VALUES (@MinDate) 

    SET @MinDate = DATEADD(DAY,7,@MinDate) 
END 

SELECT 
    d.[Date] 
    ,StockOpeningBalance = ISNULL(StockOpeningBalance,0) 
    ,LAG(ISNULL(StockOpeningBalance,0),1,0) OVER (ORDER BY d.[Date]) 
    ,Movements = ISNULL(StockOpeningBalance,0) - LAG(ISNULL(StockOpeningBalance,0),1,0) OVER (ORDER BY d.[Date]) 
FROM 
    @Dates d 
    LEFT JOIN @TableWithGaps s 
    ON d.[Date] = s.[Date] 

또한 테이블 변수보다 임시 테이블을 선호하며 임시 테이블은 더 큰 데이터 세트에서 더 잘 수행됩니다. 날짜가있는 톤을 시작하면 이와 같은 목적으로 날짜 차원 테이블을 볼 수 있습니다. Microsoft SSAS를 사용하는 경우 Google SSH를 사용할 수있는 도구가 내장되어있어 매우 빠르게 검색 할 수 있습니다.

+0

안녕하세요 Matt 저에게 다시 연락해 주셔서 감사합니다. 귀하가 제안한 것을 구현하고 내가 어떻게 시작하는지 알려 드리겠습니다! –

+0

희망이 있습니다. 조금만 변경하면 데이터 세트/날짜 범위가 큰 경우 성능이 향상 될 것입니다. – Matt

+0

@Rob_Heat 내 대답에 해결책이 있다면 받아 들여주세요. 나는 지역 사회를 도우려고이 일을하고 있지만 명성을 높이기를 원합니다. 감사!. http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work – Matt