안녕하십니까? 궁금한게 있어서 질문을 올립니다
경향을 분석하기 위한 목적에서, 이번 주를 제외하고 지난주를 시작으로 최근 10주까지의 데이타를 가지고 오고 싶습니다
예를 들어 이번주가 25주차(2014.25W)라고 하고 가정하면
TableA ( 모델, 수량, 날짜) 가 있을때 아래와 같은 결과를 가져오고 싶습니다
주차 총판매수량
2014.24W 100
2014.23W 200
2014.22W 300
2014.21W 400
2014.20W 500
2014.19W 600
2014.18W 700
2014.17W 800
2014.16W 900
2014.15W 500
그리고, 년도가 변경되었을때 2015년도 3주차인 경우에는 그 전주차부터 이전 10주차 데이타에 대해
아래처럼 결과를 가져오고 싶습니다
주차 총판매수량
2015.02W 100
2015.01W 200
2014.52W 300
2014.51W 400
2014.50W 500
2014.49W 600
2014.48W 700
2014.47W 800
2014.46W 900
2014.45W 500
고수님들의 답변을 부탁드립니다
Comment 3
-
항해자™
2014.06.22 11:34
-
향지
2014.06.22 14:48
대충 이렇게 나올것 같은데 보시고 원하시는대로 수정하시면 될 것 같습니다.
시작일, 종료일 구하고, 기준 요일이 월요일이면 1900-01-01(월) 기준으로 7일씩 나눕니다.
DECLARE @GetDate DATETIME
DECLARE @StartDt DATETIME -- 시작일
DECLARE @EndDt DATETIME -- 미만일
SET @GetDate=GETDATE()
-- 해당주월요일
SET @EndDt=DATEADD(WEEK,DATEDIFF(DAY, '1900-01-01', @GetDate)/7, '1900-01-01')
SET @StartDt=DATEADD(WEEK, -10, @EndDt)
-- 날짜테이블_샘플
; WITH std AS
(
SELECT '2014-01-01' AS StdDt
)
, DateTable AS
(
SELECT TOP 2000 StdDt
, ROW_NUMBER() OVER (ORDER BY StdDt) AS Num
, DATEADD(DAY, ROW_NUMBER() OVER (ORDER BY StdDt)-1, StdDt) AS DT
FROM std
CROSS JOIN sys.objects AS A
CROSS JOIN sys.objects AS B
CROSS JOIN sys.objects AS C
)
SELECT WK_MON AS '해당주월요일'
, DATEPART(YEAR, WK_MON) AS '년도'
, (DATEPART(DY, WK_MON)-1)/7+1 AS '주차'
--, '총판매량'
FROM
(
SELECT DATEADD(WEEK,DATEDIFF(DAY, '1900-01-01', DT)/7, '1900-01-01') AS WK_MON
-- SUM(판매량) AS '총판매량'
FROM DateTable
WHERE DT >= @StartDt AND DT < @EndDt
GROUP BY DATEDIFF(DAY, '1900-01-01', DT)/7
) AS A
ORDER BY 1 DESC
-
향지
2014.06.22 15:50
위에껀 이번주가 24주차입니다.
이번주가 25주차라고 해서 다시 만들었습니다 ㅠㅠ
주를 계산할때 년도+기준일부터의 주 차이로 합니다.
참고하셔서 하시면 될것 같습니다.
DECLARE @GetDate DATETIME
DECLARE @StartDt DATETIME -- 시작일
DECLARE @EndDt DATETIME -- 미만일
SET @GetDate='2014-02-01'
SET @EndDt=DATEADD(WEEK,DATEDIFF(DAY, '1900-01-01', @GetDate)/7, '1900-01-01')
-- 해당주월요일
SET @StartDt=DATEADD(WEEK, -10, @EndDt)
; WITH std AS
(
SELECT '2013-01-01' AS StdDt
)
, DateTable AS
(
SELECT TOP 2000 StdDt
, ROW_NUMBER() OVER (ORDER BY StdDt) AS Num
, DATEADD(DAY, ROW_NUMBER() OVER (ORDER BY StdDt)-1, StdDt) AS DT
FROM std
CROSS JOIN sys.objects AS A
CROSS JOIN sys.objects AS B
CROSS JOIN sys.objects AS C
)
SELECT TOP 10 YY AS '년도'
, (DATEPART(DY, MIN(DT))+5)/7+1 AS '주차'
, MIN(DT) AS Week_Start
, MAX(DT) AS Week_End
FROM
(
SELECT Dt
, DATEPART(YEAR, DT) AS YY
, DATEDIFF(DAY, '1900-01-01', DT)/7 AS WkCnt
FROM DateTable
WHERE DT >= @StartDt AND DT < @EndDt
) AS A
GROUP BY YY, WkCnt
ORDER bY MIN(DT) DESC
create dbo.tDateBuffer
(cYear smallint
,cYearMon int -- 201406
,cFullDate int -- 20140622
,cWeekDegree tinyint -- 주차
,cWeekNo tinyint -- 요일
)
위와 같은 테이블에 미리 데이터를 만들어 넣고 사용하면 쉽게 구할 수 있습니다,,
20-30년치 데이터를 미리 넣어 두시는 것도 괜찮겠네요ㅎㅎ
이게 아니면 현재 날자를 넣어서 원하는 결과가 나오도록 함수하나 만드심이,,
날자 연산 함수들 응용하면 어렵지 않게 계산할 수 있을 듯 합니다,,,