안녕하세요
간단한것 같으면서도 제게는 어려워서 질문드립니다..
제가 구해야하는값은 조회조건의 월 매출인데요..
예를 들어 2015/07 ~ 2016/03 기간을 정하여 조회를 했다면
프로시저에선 2015년 07월부터 2016년 03월까지의 매출데이터를 조회해야합니다
가맹점코드 | ······· | 매출합계 | 2015년7월 | 2015년8월 | ······· | 2015년12월 | 2016년1월 | 2016년2월 | 2016년3월 |
11 |
| 65 | 23 | 42 | ······· |
|
|
|
|
12 |
| 23 | 12 | 11 | ······· |
|
|
|
|
13 |
| 31 | 23 | 8 | ······· |
|
|
|
|
·
·
·
이런식으로 데이터를 뿌려줘야합니다..
우선 소스에서는 가맹점코드부터 매출합계까지는 컬럼을 고정으로만들었고 월의매출(2015년7월부터 2016년3월)까지의 컬럼은 동적으로 만들어줬습니다..
동적으로 만든 컬럼명은 SALE_YYYY_MM 이런식입니다. EX) SALE_2015_07
SELECT CD_PARTNER, ... , SUM_SALE, SALE_2015_07, SALE_2015_08, ... , SALE_2016_03
FROM T1
LEFT OUTER JOIN ..
WHERE CD_PARTNER = @P_CD_PARTNER
AND ...
이런식으로 조회 프로시저를 만들어야겠죠..
SALE_2015_07 의 데이터를 구하는것은 쉽습니다..
(매출데이터가 들어있는 테이블에서 회사코드, 가맹점코드, DT_SALE(년월)을 GROUP BY 하여 SUM 하면 가져올수있습니다..)
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
회사코드 | 가맹점코드 | DT_SALE | 매출|
TEST | 01 | 201503 | 50 |
TEST | 01 | 201503 | 23 |
TEST | 01 | 201504 | 21 |
TEST | 01 | 201504 | 21 |
TEST | 01 | 201504 | 21 |
.
.
.
문제는 조회해야하는 SALE_2015_07, SALE_2015_08 등의 컬럼들이 동적으로 만들어진다는것입니다..
그렇다는건 프로시저를 짤때도 동적으로 SELECT 해야하는데.. 어떻게 만들어야할지 막막합니다..
우선 파라미터로
시작연도(2015),
시작월(07),
월매출컬럼수( 9) //2015년7월부터 2016년3월까지니
가져왔습니다..
이것을 조합해서 알고리즘을 짜주셨으면 좋겠습니다...ㅠㅠ
제가 초보기에.. 디테일하게 짜주시면 정말 감사하겠습니다...
Comment 7
-
Terry
2016.01.06 15:40
-
Terry
2016.01.06 16:25
내용 추가합니다.
TEST | 01 | 201503 | 50
Group By 를 이용하여 위의 형태대로 데이터 Select
해당값들을 Pivot 으로 처리.. ( 동적 쿼리로.. )
동적쿼리,Pivot 을 이용하면 생각보다 간단하게 데이터가 나올거 같네요..
그럼 성공하시길..화이팅~!!
-
Terry
2016.01.06 19:44
-
Terry
2016.01.06 20:02
샘플쿼리입니다..참조만 하세요...
하기 쿼리를 프로시저로 ( 파라미터 -> ( @as_from_yymm char(6), @as_to_yymm char(6) ) 로 처리 )
생성후 실행하시면 될겁니다.
세부적인 조건들은 실제 사용하는 테이블과 데이터 유형에 맞게끔
가공이 필요할 거구요..
---쿼리시작---
Declare @as_from_yymm char(6),@as_to_yymm char(6)
--각종 내부 변수 선언
Declare @ll_i Decimal(18,0)
Declare @ll_cnt Decimal(18,0)--일단 입력한 값에 상관없이 하기 샘플데이터로만 처리하게끔 파라미터(아규먼트) 값 강제 셋팅
Select @as_from_yymm = '201503',@as_to_yymm = '201507'
--해당월간의 차이를 구함 ( 후단에서 몇회 반복을 할건지 결정하는 요소가 됨 )
Select @ll_cnt = DATEDIFF(mm,@as_from_yymm+'01',@as_to_yymm+'01')
Declare @ls_sql varchar(max)DROP TABLE #temp_tbl
--임시테이블 생성
Create Table #temp_tbl
(
회사코드 Char (10 ) Null
,가맹점코드 Char (10 ) Null
,DT_SALE Char (6 ) Null
,매출 Decimal(18,0) Null
)
/*
--실제 Data Select 구문으로 변경필요함
Insert
Into #temp_tbl
Select a.회사코드
,a.가맹점코드
,a.DT_SALE
,Sum(a.매출) As 매출
From T1 a
Where a.DT_SALE Between @as_from_ymd And @as_to_ymd
Group By a.회사코드
,a.가맹점코드
,a.DT_SALE
*/
--하기 Insert Data는 집계한 값이 이럴것이다 라는 가정으로 출발함
Insert
Into #temp_tbl
Select 'TEST','01','201503',50 Union All
Select 'TEST','01','201504',23 Union All
Select 'TEST','01','201505',21 Union All
Select 'TEST','01','201506',21 Union All
Select 'TEST','01','201507',21DECLARE @COLS VARCHAR(8000) ='';
DECLARE @SQL VARCHAR(8000);
WITH TBL_CTE AS (SELECT DT_SALE as [date] FROM #temp_tbl GROUP BY DT_SALE)
SELECT @COLS = @COLS +',['+ CAST([date] AS VARCHAR(100))+']'
FROM TBL_CTE;
Set @COLS = SubString(@COLS,2,LEN(@COLS))Set @ls_sql = ''
Set @ls_sql = @ls_sql + '
Select
*
From #temp_tbl
Pivot
(
Sum(매출) For DT_SALE In (' + @COLS + ')
) As j
'Exec (@ls_sql)
---쿼리끝---
-
후알유?
2016.01.11 14:30
감사합니다! 도움많이됐습니다..^^
-
minsouk
2016.01.07 15:03
이제 exists 가 사라진듯 해요....씨익~ ^_- ~
-
Terry
2016.01.07 22:37
실제 현업에 적용중인 쿼리는 Exists , Not Exists 가 많아요 ^^;
예) 201501 부터 201508 까지 했다고 가정..
아규먼트 명은 @as_from_yymm, @as_to_yymm 이라고 가정
Declare @sql varchar(max)
Declare @i decimal(18,0)
Set @sql = 'Select '
While @i < 8
Begin
Set @sql = ' 컬럼~~ As 컬럼''' + Left(@as_from_yymm,4) + Convert(char(2),@i) + '''
End
Set @sql = @sql + 'From 테이블'
Set @sql = @sql + 'Where 조건절'
Exec @sql
간략한 동적SQL 사용법 기술해둔 형태이니
참고만 하세요..^^;