티스토리 뷰

반응형


SQL 팁과 관련된 지난글 보기

[DB(MS, PG, MY..etc)] - MS-SQL 튜닝에 대한 짧은 생각

[DB(MS, PG, MY..etc)] - 하위 테이블에서 걸러낸 결과로 전체 컬럼 가져오기(group by, having count)


보통 SQL에서 쿼리를 실행하게 되면 그 결과는 이런식으로 출력이 된다.


1. 컬럼명 가로형

column1

column2 

column3 

column4 

value1

value2 

value3 

value4 


그런데 데이터 외부 요청자료라든지... 추출을 통한 문서작성 업무를 하다보면 쿼리 결과를 복사해서 붙여넣기 편하게


2. 컬럼명 세로형

column1

value1 

column2 

value2 

column3

value3 

column4

values4 


이런식으로 나왔으면 하는 경우도 있다.


하지만 컬럼이 왜 "컬럼"이고 로우가 왜 "로우"겠는가.


다 이유가 있으니 처음과 같은 형태로 출력이 되는 것이다.


하지만~!!!


그렇다고 안해보면 또 서운하니까 ^^ 한 번 만들어 볼 수는 있겠다.


방법은 다음과 같이 union을 사용하면 된다.


(하지만... 결과를 내 보면 알겠지만 나중에 order by 에서 대부분 문제가 다시 발생한다.)


/* 명세

테이블 명 : change_ver_hor

컬럼 : name, e_name, ph, e_mail


여기서는 텍스트 결과보기(Ctrl+T)로 표시했지만 SSMS에서 작업하기 편하게 하려면 표형태 결과보기(Ctrl+D)가 결과 작업 시 편함.

*/


-- 원래는 이렇게 출력됨

select *

from change_ver_hor


name                 e_name               ph              e_mail

-------------------- -------------------- --------------- ------------------------------

박보검                  park-treasure_sword  010-1234-5678   pts@pts.com


(1개 행 적용됨)





-- 컬럼명 세로전환 1단계


select 'name' as 'col', name as 'values'

from change_ver_hor

union

select 'e_name', e_name

from change_ver_hor

union

select 'ph', ph

from change_ver_hor

union

select 'e-mail', e_mail

from change_ver_hor


col    values
------ ------------------------------
e_name park-treasure_sword
e-mail pts@pts.com
name   박보검
ph     010-1234-5678

(4개 행이 영향을 받음)



자...이렇게 결과값이 컬럼이 세로가 되도록 살짝 꼼수를 줘 봤다.


그런데 결과가 좀... 이상한 것이 느껴질텐데


union의 order by가 문자열로 자동정렬되기 때문에 원래 원하던 컬럼 순서대로 출력되지 않는 것이 문제점이다.


따라서 여기서 한 단계더 작업을 해야 원하는 결과대로 값을 출력할 수가 있다.


-- 컬럼명 세로전환 2단계 정렬문제 해결


select 1 as idx, 'name' as 'col', name as 'values'

from change_ver_hor

union

select 2, 'e_name', e_name

from change_ver_hor

union

select 3, 'ph', ph

from change_ver_hor

union

select 4, 'e-mail', e_mail

from change_ver_hor

order by idx




idx         col    values

----------- ------ ------------------------------

1           name   박보검

2           e_name park-treasure_sword

3           ph     010-1234-5678

4           e-mail pts@pts.com


(4개 행이 영향을 받음)




이렇게 컬럼의 앞단에 정수형의 idx값을 임의로 주고 거기에 따라 정렬을 시키는 것이다.


여기까지 방법을 사용하면 컬럼을 세로로 만들고 그 옆에 값을 붙여넣는 형태로 결과를 출력한 후 엑셀 파일등에 바로 붙여넣기가 가능하다.


하지만 이 방법도 단점이 존재하는데....


첫 번째는 컬럼이 많을 경우 union을 그만큼 많이 사용해야 하는데 그렇게 하면 쿼리 작성이 복잡해지고 가독성이 떨어진다.


두 번째는 역시 union의 사용인데... 사실 union이 쿼리 성능에는 썩 좋지 않기 때문에 복잡한 쿼리의 경우에는 성능저하가 올 수도 있다.


따라서 단순한 쿼리일 경우에는 이렇게 작업해도 무방하겠으나


만약 쿼리 결과를 엑셀파일에 붙여넣어 결과물을 만든다고 가정한다면 이것보다 더 좋은 방법이 있다.



(먼저 가로상태로 나온 쿼리 결과를 엑셀에 붙여넣고)


(복사한 다음 우클릭 해서 선택하여 붙여넣기)



(선택하여 붙여넣기에서 맨 아래 빨간 동그라미 "행/열 바꿈"을 체크한 후 확인)



(그럼 위와같이 원하던 결과가 나온다.)



결론은 엑셀에서 작업할 거면 그냥 원래대로 하고 엑셀에서 붙여넣기 옵션을 변경하면 더 쉽게 할 수도 있다는 것.


선택은 각자의 몫이지만 최대한 귀찮지 않게 작업을 하는게 목표이므로... ㅎㅎㅎ






반응형
댓글
반응형
05-17 05:57
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함