[MS-SQL]월별 주차별 데이타를 구하고 싶습니다.
CREATE TABLE TEST(메뉴명 CHAR(3),일자 CHAR(8),금액 INT)
INSERT TEST VALUES('AAA','20090101',34343)
INSERT TEST VALUES('AAA','20090101',9889)
INSERT TEST VALUES('BBB','20090203',34)
INSERT TEST VALUES('CCC','20090301',23)
------------------------------------------------
DECLARE @SDATE CHAR(6),@EDATE CHAR(6),@SQL VARCHAR(8000)
DECLARE @MAX_WEEK TABLE (YYMM CHAR(6),MAX_WK INT,WK INT)
SELECT @SDATE = '200901',@EDATE = '200903'
SELECT @SQL = 'SELECT 메뉴명 메뉴' + CHAR(10)
INSERT @MAX_WEEK
SELECT CONVERT(CHAR(6),DATEADD(M,NUMBER,@SDATE+'01'),112) YYMM,
DATEPART(WK,DATEADD(M,NUMBER+1,@SDATE+'01')-1)
- DATEPART(WK,DATEADD(M,NUMBER,@SDATE+'01'))+1 MAX_WK,
DATEPART(WK,DATEADD(M,NUMBER+1,@SDATE+'01')-1) WK
FROM master.dbo.spt_values
WHERE TYPE = 'P'
AND NUMBER <= DATEDIFF(M,@SDATE+'01',@EDATE +'01')
SELECT @SQL = @SQL +
CASE B.NUMBER
WHEN 0 THEN ',SUM(CASE WHEN 일자 LIKE ''' + YYMM + '%'' THEN 금액 ELSE 0 END) AS TOTAL' +
CHAR(10)
ELSE ',SUM(CASE WHEN 일자 LIKE ''' + YYMM + '%'' AND DATEPART(WK,일자) = '
+ CONVERT(VARCHAR(10),DATEPART(WK,DATEADD(WK,B.NUMBER,YYMM+'01'))) + ' THEN 금액
ELSE 0 END) AS ['
+ STR(B.NUMBER,1) + '주차]' + CHAR(10) END
FROM @MAX_WEEK A JOIN master.dbo.spt_values B ON A.MAX_WK >= B.NUMBER
WHERE TYPE = 'P'
SELECT @SQL = @SQL + ' FROM TEST GROUP BY 메뉴명 WITH ROLLUP'
EXEC(@SQL)
/*
메뉴 TOTAL 1주차 2주차 3주차 4주차 5주차 TOTAL 1주차 2주차
3주차 4주차 TOTAL 1주차 2주차 3주차 4주차 5주차
---- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- -------
---- ----------- ----------- ----------- ----------- ----------- ----------- ----------- -----------
AAA 44232 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0
BBB 0 0 0 0 0 0 34 0 0 0 0
0 0 0 0 0 0
CCC 0 0 0 0 0 0 0 0 0 0 0
23 0 0 0 0 0
NULL 44232 0 0 0 0 0 34 0 0 0 0
23 0 0 0 0 0
(4개 행이 영향을 받음)
*/
> 손님 님이 쓰신 글
> ----------------------------------------------------------
> OS : Microsoft Windows 2000 Server / Advanced Server
> SQL : Microsoft SQL Server 2000 Standard / Enterprise Edition
>
> 테이블에는 일자별로 데이타가 들어가 있습니다.
> 같은메뉴나 같은일자가 중복되서 들어갈수도 있습니다.
> -------------------------------------------------------------
> 메뉴명 일자 금액
> -------------------------------------------------------------
> AAA 20090101 34343
> AAA 20090101 9889
> BBB 20090203 34
> CCC 20090301 23
> ....
>
> 이런 테이블이 있을때 사용자로 부터 시작년월 ~ 끝년월에 데이타를 받습니다.
> 사용자가 만일
> 사용자는 200901 ~ 200903 이렇게 입력을 한다면
> 2009년 01월달에 있는 첫째주차 부터 마지막 주차 (1월달 1주부터 ~ 4주)
> 2009년 02월달에 있는 첫째주차 부터 마지막 주차 (2월달 1주부터 ~ 4주)
> 2009년 03월에 있는 첫째부차 부터 마지막 주차 (3월달 1주부터 ~ 4주)
> (* 달에 따라서는 한달에 5주가 존재할 수도 있습니다.)
> 제가 원하는 결과는
> -----------------------------------------------------------------------------------------------------
> 메뉴 | 2009년01월 | 200902월
> -----------------------------------------------------------------------------------------------------
> | 1주차 2주차 3주차 4주차 Total | 1주차 2주차 3주차 4주차 Total
> -----------------------------------------------------------------------------------------------------
> AAA | 금액 금액 금액 금액 토탈금액| 금액 금액 금액 금액 토탈금액
> BBB | 금액 금액 금액 금액 토탈금액| 금액 금액 금액 금액 토탈금액
> ....
> ...
> -----------------------------------------------------------------------------------------------------
> 합계 | 합계 합계 합계 합계 토탈합계| 합계 합계 합계 합계 토탈합계
> -----------------------------------------------------------------------------------------------------
>
INSERT TEST VALUES('AAA','20090101',34343)
INSERT TEST VALUES('AAA','20090101',9889)
INSERT TEST VALUES('BBB','20090203',34)
INSERT TEST VALUES('CCC','20090301',23)
------------------------------------------------
DECLARE @SDATE CHAR(6),@EDATE CHAR(6),@SQL VARCHAR(8000)
DECLARE @MAX_WEEK TABLE (YYMM CHAR(6),MAX_WK INT,WK INT)
SELECT @SDATE = '200901',@EDATE = '200903'
SELECT @SQL = 'SELECT 메뉴명 메뉴' + CHAR(10)
INSERT @MAX_WEEK
SELECT CONVERT(CHAR(6),DATEADD(M,NUMBER,@SDATE+'01'),112) YYMM,
DATEPART(WK,DATEADD(M,NUMBER+1,@SDATE+'01')-1)
- DATEPART(WK,DATEADD(M,NUMBER,@SDATE+'01'))+1 MAX_WK,
DATEPART(WK,DATEADD(M,NUMBER+1,@SDATE+'01')-1) WK
FROM master.dbo.spt_values
WHERE TYPE = 'P'
AND NUMBER <= DATEDIFF(M,@SDATE+'01',@EDATE +'01')
SELECT @SQL = @SQL +
CASE B.NUMBER
WHEN 0 THEN ',SUM(CASE WHEN 일자 LIKE ''' + YYMM + '%'' THEN 금액 ELSE 0 END) AS TOTAL' +
CHAR(10)
ELSE ',SUM(CASE WHEN 일자 LIKE ''' + YYMM + '%'' AND DATEPART(WK,일자) = '
+ CONVERT(VARCHAR(10),DATEPART(WK,DATEADD(WK,B.NUMBER,YYMM+'01'))) + ' THEN 금액
ELSE 0 END) AS ['
+ STR(B.NUMBER,1) + '주차]' + CHAR(10) END
FROM @MAX_WEEK A JOIN master.dbo.spt_values B ON A.MAX_WK >= B.NUMBER
WHERE TYPE = 'P'
SELECT @SQL = @SQL + ' FROM TEST GROUP BY 메뉴명 WITH ROLLUP'
EXEC(@SQL)
/*
메뉴 TOTAL 1주차 2주차 3주차 4주차 5주차 TOTAL 1주차 2주차
3주차 4주차 TOTAL 1주차 2주차 3주차 4주차 5주차
---- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- -------
---- ----------- ----------- ----------- ----------- ----------- ----------- ----------- -----------
AAA 44232 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0
BBB 0 0 0 0 0 0 34 0 0 0 0
0 0 0 0 0 0
CCC 0 0 0 0 0 0 0 0 0 0 0
23 0 0 0 0 0
NULL 44232 0 0 0 0 0 34 0 0 0 0
23 0 0 0 0 0
(4개 행이 영향을 받음)
*/
> 손님 님이 쓰신 글
> ----------------------------------------------------------
> OS : Microsoft Windows 2000 Server / Advanced Server
> SQL : Microsoft SQL Server 2000 Standard / Enterprise Edition
>
> 테이블에는 일자별로 데이타가 들어가 있습니다.
> 같은메뉴나 같은일자가 중복되서 들어갈수도 있습니다.
> -------------------------------------------------------------
> 메뉴명 일자 금액
> -------------------------------------------------------------
> AAA 20090101 34343
> AAA 20090101 9889
> BBB 20090203 34
> CCC 20090301 23
> ....
>
> 이런 테이블이 있을때 사용자로 부터 시작년월 ~ 끝년월에 데이타를 받습니다.
> 사용자가 만일
> 사용자는 200901 ~ 200903 이렇게 입력을 한다면
> 2009년 01월달에 있는 첫째주차 부터 마지막 주차 (1월달 1주부터 ~ 4주)
> 2009년 02월달에 있는 첫째주차 부터 마지막 주차 (2월달 1주부터 ~ 4주)
> 2009년 03월에 있는 첫째부차 부터 마지막 주차 (3월달 1주부터 ~ 4주)
> (* 달에 따라서는 한달에 5주가 존재할 수도 있습니다.)
> 제가 원하는 결과는
> -----------------------------------------------------------------------------------------------------
> 메뉴 | 2009년01월 | 200902월
> -----------------------------------------------------------------------------------------------------
> | 1주차 2주차 3주차 4주차 Total | 1주차 2주차 3주차 4주차 Total
> -----------------------------------------------------------------------------------------------------
> AAA | 금액 금액 금액 금액 토탈금액| 금액 금액 금액 금액 토탈금액
> BBB | 금액 금액 금액 금액 토탈금액| 금액 금액 금액 금액 토탈금액
> ....
> ...
> -----------------------------------------------------------------------------------------------------
> 합계 | 합계 합계 합계 합계 토탈합계| 합계 합계 합계 합계 토탈합계
> -----------------------------------------------------------------------------------------------------
>