database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
ㆍPostgreSQL
Firebird
Oracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
PostgreSQL Q&A 6881 게시물 읽기
No. 6881
이런 쿼리문이 가능한가요?
작성자
신창우(lirli)
작성일
2006-11-07 09:34ⓒ
2006-11-07 10:04ⓜ
조회수
5,319

테이블 구조는

[번호][제품] [공정]
    1    제품1   공정1
    2    제품2   공정1
    3    제품3   공정1
    4    제품1   공정2
    5    제품2   공정2
    6    제품3   공정2 
    7    제품1   공정3
    8    제품2   공정3
    9    제품3   공정3 

결과를 아래와같이 도출하고싶습니다.
........[공정1][공정2][공정3]
제품1      1       1         1
제품2      1       1         1
제품3      1       1         1         


위 표처럼 공정별 불량 접수 건수를 알아낼수있는 쿼리가있습니까?


몇일 동안 이래 저래 해봐도 도저히 안되네요. 도움 부탁드리겠습니다. 

 

이 글에 대한 댓글이 총 4건 있습니다.
http://database.sarang.net/?inc=read&aid=5164&criteria=pgsql&subcrit=&id=&limit=20&page=1

tablefunc 로 검색해 보시면 원하시는 답이 있지 않을까 싶습니다 ㅋ;
신기배(소타)님이 2006-11-07 10:14에 작성한 댓글입니다.

이렇게 행과 열을 뒤집는 쿼리를 PGSQL 에서는 CROSSTAB  이라 하는데

불편한 점이라면, 위의 예에서는 공정1,  ... 공정3 까지 3 개로 고정적인데

이것을 공정n 까지 가변적으로 작동시킬려면 (MSSQL 등 보다)다소 불편합니다.

초보대왕님이 2006-11-07 10:23에 작성한 댓글입니다. Edit

모호한 문제가 발생함니다.

공정의 갯수가 일정범위 이하라는 전제가 반드시 있어야 겟네요

postgres의경우
"Maximum Columns per Table 250 - 1600 depending on column types "

칼럼수 제한이 있어서 데이타에 나열하려는 항목의 종류가 위 값을 초과하는경우는 처리할수가 없겟지요

때문에 저런경우의 처리를 해야할 상황이 종종 현실에 나타나지만 DB차원에서 완전한형태로 지원하는건 불가능할거라봄니다.

외부 어플리케이션의 도움을 받는게 더 낳지않나 싶어요.

어설프지만 제경우의 처리를 보기로 드리겟슴니다.

흔히 현실에서 발생하는 경우로 이해하기쉬운 성적관리의 경우

이름,과목,성적
==>
이름,과목1,과목2,과목3,....

이렇게 하고 싶을때는 과목의 종류가 거의 명백하게 제한되 있어서 별 어려움이 없지요.

하지만 저의 경우 과목의 종류가 아주 불분명하고 갯수를 예측할 수 없는 경우였는데
이 경우 최대치를 두고  일정범위밖은 예외처리로 했슴니다.

처리방법은

1) 원자료에서 과목의 종류를 구한다.( 칼럼갯수와 칼럼명을 얻음 )
2) sql문작성 --> 외부 어플리케이션의 도움
3) sql문실행

입니다.

==============================================================================

create table datas
(
    product text not null primary key,
    step text not null,
    errs int default 0
);

위와같은 태이블에서 아래 두개의 값을 얻음니다.

java,c,php등의 도움을 얻어 처리함니다.( 실제코드완 다름니다. 슈도코드로 보세요 )

step_count = null
step_names[] = select step from datas group by step;
max_steps = 80 ( 운영자가 지정 )

==> 아래처럼 결과를 얻었다고 가정해봄니다.
  step_names[] = { '공정1','공정2','공정3','공정4','공정5','공정6','공정7' }
  if( count(step_names) > max_steps ) step_names = step_names[0:max_steps]
 
  step_count = count(step_names)
 
==> 두개의 값을 구했으면 아래처럼 sql문을 어플리케이션에서 생성함니다.( 자동으로 생성되도록 )

-----------------------------------------------------------------------
select product,
    sum( case when step = '공정1' then cnt else 0 end ) as '공정1',
    sum( case when step = '공정2' then cnt else 0 end ) as '공정2',
    sum( case when step = '공정3' then cnt else 0 end ) as '공정3',
    sum( case when step = '공정4' then cnt else 0 end ) as '공정4',
    sum( case when step = '공정5' then cnt else 0 end ) as '공정5',
    sum( case when step = '공정6' then cnt else 0 end ) as '공정6',
    sum( case when step = '공정7' then cnt else 0 end ) as '공정7',
    sum( case when step not in ( '공정1','공정2','공정3','공정4','공정5','공정6','공정7')
        then cnt else 0 end ) as '기타',
from (
select product,step,sum(errs) as cnt from datas
where ( some conditions,... )
group by product,step
)
group by product
-----------------------------------------------------------------------

공정의 종류,갯수가 수시로 변해도 코드 수정없이 사용할 수 가 있는데

공정이 완전히 고정되 있다면 crosstab모듈을 이용하는게 편리하겟네요


 

가우님이 2006-11-07 15:14에 작성한 댓글입니다. Edit

답변해주신 3분 모두 감사합니다.
제 경우에는 가우님 말씀처럼 공정이 동적이라서
님 처럼 해결하는게 가장 좋을것같습니다.

다시 한번 감사드립니다.

신창우(lirli)님이 2006-11-08 08:47에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
6884insert 할때 시퀀스를 자동으로 DB 에서 증가 시키려면 어떻게?? [3]
그냥이
2006-11-08
5173
6883C#-PostgreSQL연결구사방법 [2]
김영진
2006-11-07
5418
6882group by질문입니다. [2]
쪼땅
2006-11-07
4033
6881이런 쿼리문이 가능한가요? [4]
신창우
2006-11-07
5319
6880[질문]Oracle to PostgreSql
삽질
2006-11-06
3808
6879INTERVAL Type을 INTEGER 값으로 Cast 연산은? [2]
파란산타
2006-11-04
4470
6878분산처리 시스템 [6]
조진우
2006-11-03
5708
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.023초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다