아래 사진을 참고하세요.
아래 정보를 웹에서 조회할 수 있게 관리하려고 합니다.
파란색 상자는 상황에 따라 동적으로 증가되기도 하고 감소하기도 합니다.
테이블 구조는
직원 테이블
구분 아이디 이름 입사일자
신입 1111111 홍길동 2015-10-01
...
단계 테이블
아이디 단계 단계이름 교육일자 교육시간 배점
1111111 1 A교육 2015-10-01 30분 8점
1111111 1 A교육 2015-10-01 30분 8점
1111111 1 A교육 2015-10-01 30분 8점
1111111 1 A교육 2015-10-01 30분 8점
1111111 1 A교육 2015-10-01 30분 8점
1111111 1 A교육 2015-10-01 30분 8점
1111111 1 A교육 2015-10-01 30분 8점
2222222 2 B교육 2015-10-01 30분 10점
...
이런식으로 설계할 예정이었습니다. ( 단계가 추가되면 insert 되어 관리될 수 있도록 )
쿼리는
직원 테이블을 기준으로 직원 테이블의 컬럼 사이에 단계테이블을 조인하여 중간에 삽입하고 싶습니다...
어떤 방법으로 접근해야할지 모르겠네요.
ps. 단계 테이블을 피벗하여 직원 테이블과 조인하여 쿼리를 접근하려고 했으나 방법이 틀린 것 같아서...
조언 또는 쿼리 조언 부탁드립니다.
감사합니다.
DECLARE @COLUMNS_MINUTE NVARCHAR(MAX)
DECLARE @SQL_MINUTE NVARCHAR(MAX)
SET @COLUMNS_MINUTE = N'';
SELECT @COLUMNS_MINUTE += N', p.' + QUOTENAME(EDU_LEV)
FROM (
SELECT ER.EDU_LEV
FROM UTB_EDUCATION_RESULT ER
GROUP BY ER.EDU_LEV ) A
PRINT @COLUMNS_MINUTE
SET @SQL_MINUTE = N'
SELECT EMP_ID "EMP_ID", ' + STUFF(@COLUMNS_MINUTE, 1, 2, '') + '
INTO PIVOT_MINUTE
FROM (
SELECT EMP_ID
,EDU_LEV
,EDU_MINUTE
FROM UTB_EDUCATION_RESULT ER
) A
PIVOT (
SUM(EDU_MINUTE) FOR EDU_LEV IN ('
+ STUFF(REPLACE(@COLUMNS_MINUTE, ', p.[', ',['), 1, 1, '')
+ ')
) AS p'
PRINT @SQL_MINUTE
EXEC SP_EXECUTESQL @SQL_MINUTE
DECLARE @COLUMNS_SCORE NVARCHAR(MAX)
DECLARE @SQL_SCORE NVARCHAR(MAX)
SET @COLUMNS_SCORE = N'';
SELECT @COLUMNS_SCORE += N', p.' + QUOTENAME(EDU_LEV)
FROM (
SELECT ER.EDU_LEV
FROM UTB_EDUCATION_RESULT ER
GROUP BY ER.EDU_LEV ) A
PRINT @COLUMNS_SCORE
SET @SQL_SCORE = N'
SELECT EMP_ID "EMP_ID", ' + STUFF(@COLUMNS_SCORE, 1, 2, '') + ' "SCORE "
INTO PIVOT_SCORE
FROM (
SELECT EMP_ID
,EDU_LEV
,EDU_SCORE
FROM UTB_EDUCATION_RESULT ER
) A
PIVOT (
SUM(EDU_SCORE) FOR EDU_LEV IN ('
+ STUFF(REPLACE(@COLUMNS_SCORE, ', p.[', ',['), 1, 1, '')
+ ')
) AS p'
PRINT @SQL_SCORE
EXEC SP_EXECUTESQL @SQL_SCORE
SELECT *
FROM UTB_EDUCATION (NOLOCK) ER
INNER JOIN PIVOT_MINUTE (NOLOCK) PM
ON ER.EMP_ID = PM.EMP_ID
INNER JOIN PIVOT_SCORE (NOLOCK) PS
ON ER.EMP_ID = PS.EMP_ID
데이터를 있는 그대로 웹서버에 넘기고 웹서버에서 처리하는게 더 편하고 빠를 듯 해 보입니다.
추가로, 몇 단계까지 있다는 것 정도만 알려주면 좋겠네요.
레코드 셋을 단계 데이터와 그 이외로 분리해서 주면 처리가 더 쉽겠네요.
레코드 셋 내에서 필터를 적용할 수 있으니까요.
2중 루프문에서 세로 방향으로 처리와 가로 방향 처리로 어렵지 않게 구현할 수 있을 듯 합니다.