티스토리 뷰
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
자...이렇게 결과값이 컬럼이 세로가 되도록 살짝 꼼수를 줘 봤다.
그런데 결과가 좀... 이상한 것이 느껴질텐데
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이 쿼리 성능에는 썩 좋지 않기 때문에 복잡한 쿼리의 경우에는 성능저하가 올 수도 있다.
따라서 단순한 쿼리일 경우에는 이렇게 작업해도 무방하겠으나
만약 쿼리 결과를 엑셀파일에 붙여넣어 결과물을 만든다고 가정한다면 이것보다 더 좋은 방법이 있다.
(먼저 가로상태로 나온 쿼리 결과를 엑셀에 붙여넣고)
(복사한 다음 우클릭 해서 선택하여 붙여넣기)
(선택하여 붙여넣기에서 맨 아래 빨간 동그라미 "행/열 바꿈"을 체크한 후 확인)
(그럼 위와같이 원하던 결과가 나온다.)
결론은 엑셀에서 작업할 거면 그냥 원래대로 하고 엑셀에서 붙여넣기 옵션을 변경하면 더 쉽게 할 수도 있다는 것.
선택은 각자의 몫이지만 최대한 귀찮지 않게 작업을 하는게 목표이므로... ㅎㅎㅎ
'DB(MS, Oracle, PG, MY..etc)' 카테고리의 다른 글
쿼리 작성 예제 - 연속된 날짜 집합 구하기(row_number) (1) | 2019.01.16 |
---|---|
간단한 join과 sum을 사용한 누계 만들기 및 응용 (0) | 2019.01.15 |
하위 테이블에서 걸러낸 결과로 전체 컬럼 가져오기(group by, having count) (0) | 2019.01.09 |
MS-SQL 튜닝에 대한 짧은 생각 (0) | 2019.01.02 |
temp DB 레이드 위치(다른 하드 디스크로) 이동 (0) | 2013.12.23 |
- Total
- Today
- Yesterday
- 추억의 게임
- C
- J.S Bach
- 8비트상성
- xml강좌
- 다른그림찾기
- 오락실 게임
- 고전게임
- 플래시 게임
- 틀린그림찾기
- 플래시게임
- 8비트
- brawlstars
- 오락실게임
- 엑셀
- 플래쉬게임
- XML
- XML Programming with VB 6.0
- 고전명작
- 브롤스타즈
- 레트로게임
- SQL
- 중독성짱게임
- 플래시
- Excel
- c#
- MS-SQL
- 플래쉬 게임
- 플래쉬
- 좀비게임
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |