2016-12-06 2 views
3

저는 SQL Server의 새로운 기능입니다 (예 : 10 분). 몇 가지 열 (단위, 날짜, 마스터 ID, AVE 월간 매출)이 포함 된 테스트 데이터베이스가 있습니다. 평균 월간 판매량이 비어 있습니다.SQL Server : 평균 판매 범위 (기간 기준)

배경 : Excel 파일에서 데이터를 가져오고 다른 파일에서 파일을 빌드하고 평균 판매 계산 시간이 Excel로 인해 나를 미치게 만듭니다. 따라서이 게시물을 게시하십시오.

내가하고 싶은 것은 관련 행의 날짜를 기준으로 지난 6 개월 동안 평균 판매 열을 평균 단위로 채우는 것입니다. 즉, 날짜가 2016-06-31 일 경우 2016-01-01에서 2016-06-31까지 (해당 마스터 ID는 나의 고유 키가 아닙니다) 평균 판매 단위를 가져와야합니다. .

언급 한 것처럼 SQL을 처음 사용하기 때문에 SQL Server Express (로컬로 실행)를 사용하고 데이터 테이블 (SALES)은 약 8m 행을 사용합니다. 이 같은 계산을 SQL로 수행해야하는지 확실하지 않지만 현재 접근 방식 (Excel)보다 빠른지 확인할 수 있도록 노력하고 싶습니다.

예를 들어 설명 할 수 있다면 좋을 것입니다.

감사합니다. 마크.

+0

실행중인 Express 버전 (2008, 2012, 2014 등)? –

+0

안녕하세요, Rich를 사용하고 있습니다. 2016 –

+0

그리고이 데이터를 테이블에 보관해야합니까, 아니면 데이터를 가져올 때만이 새 열을 원할 것입니까 (쿼리에서 계산할 수 있도록)? –

답변

0

someuniquefield를 기본 키 열로 바꾸고 select 만 먼저 테스트하십시오.

UPDATE t SET [AVE Monthly Sales] = x.avgsum FROM table t JOIN 
(SELECT someuniquefield , 
    AVG(CASE WHEN date > DATEADD(m, -6, date - DATEPART(d, date) + 1) THEN Units END) OVER (ORDER BY Date DESC) avgsum 
    FROM table ) as x 
ON x.someunqiuefield.=t.someuniquefield 
0

난 당신이 오히려 고정 된 값 (데이터가 수정 될 올바른 값이 표시를 허용하는)에 비해 동적 할 거라고 믿고있어. 아래 예제는 SELECT 쿼리에서 기본 데이터를 수정하지 않고이 작업을 수행하는 방법을 보여줍니다.

테스트 데이터 (# = 임시 테이블)

CREATE TABLE #TestTable (Units int, Date_Field datetime, Master_ID int) 
INSERT INTO #TestTable (Units, Date_Field, Master_ID) 
VALUES 
(10,'2016-07-06',1) 
,(20,'2016-08-06',1) 
,(30,'2016-09-06',1) 
,(40,'2016-10-06',1) 
,(50,'2016-11-06',1) 
,(60,'2016-12-06',1) 
,(70,'2016-10-06',2) 
,(80,'2016-11-06',2) 
,(90,'2016-12-06',2) 

쿼리

SELECT 
    tt.Master_ID 
    ,tt.Date_Field 
    ,tt.Units 
    ,SUM(tt2.Units) Sum_Units 
FROM #TestTable tt 
LEFT JOIN #TestTable tt2 
    ON tt2.Date_Field BETWEEN DATEADD(m,-3,tt.Date_Field) AND tt.Date_Field 
    AND tt.Master_ID = tt2.Master_ID 
GROUP BY tt.Master_ID, tt.Date_Field, tt.Units 
ORDER BY tt.Master_ID, tt.Date_Field 

출력

Master_ID Date_Field     Units Sum_Units 
1   2016-07-06 00:00:00.000  10  10 
1   2016-08-06 00:00:00.000  20  30 
1   2016-09-06 00:00:00.000  30  60 
1   2016-10-06 00:00:00.000  40  90 
1   2016-11-06 00:00:00.000  50  120 
1   2016-12-06 00:00:00.000  60  150 
2   2016-10-06 00:00:00.000  70  70 
2   2016-11-06 00:00:00.000  80  150 
2   2016-12-06 00:00:00.000  90  240 

여기에 논리는 당신이 함께 같은 테이블에 다시 합류한다는 것입니다 날짜 범위를 누적 합계를 나타내는 -3 개월 (이 예제의 경우)으로 지정하십시오.

데이터를 가져올 때 한 번만 실행하면되므로 계산 된 열 (다른 접근 방식)에 데이터를 유지하려고하는 것이 더 쉽습니다. 계산 된 열은 데이터를이 테이블에 넣을 때마다 계산해야합니다.

+0

안녕하세요, 귀하의 자세한 답변 주셔서 감사합니다, 나는 당신이 한 것을 가지고 놀려고합니다. 그리고 나는 다시 당신에게 돌아갈 것입니다. –