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
운영게시판
최근게시물
MySQL Q&A 30582 게시물 읽기
No. 30582
기간별 작업시간 구하기
작성자
왕초보
작성일
2013-04-17 22:18
조회수
9,364


다음과 같은 작업을 구현하려고 합니다.

#################################################
worker : 테이블[작업자]
#################################################
worker_id : string
worker_name : string

#################################################
workingTime : 테이블[작업내용]
#################################################
worker_id : string
working_gubun : string [업무/휴식]
working_date : date
working_time : int


두 테이블을 이용해서 아래와 같은 결과를 얻고자 합니다.
[2013-01-01 부터 2013-01-31 까지 업무 시간만]
[workingTime의 데이터는 입력한 값만 저장되어있습니다.]
worker_id     worker_name     2013-01-01     2013-01-02     ......     2013-01-31
--------------------------------------------------------------------------------------------------------
111111111          홍길동                   0                    1                                0
222222222          홍철수                   2                    0                                1
......
   

고수님들의 지도편달 부탁드립니다. ^*^
 

이 글에 대한 댓글이 총 1건 있습니다.

안녕하세요 박성원입니다.

오랜만에 사랑넷에 놀러왔네요

 

문의하신

조인 피벗의 경우 보통 매우 복잡도가 높아집니다. 물런, 내공이 높으신분은 후다닥 하시겠지만

저는 보통 python으로 계산해서 뿌리는것을 선호하죠 ^^;;

 

여튼 쿼리를 이용한 해결법은 더 손이 많이 가는데요 (컬럼이름을 일일이 수정해줘야합니다. ;;)

아래와 같이 풀어 낼 수 있습니다.

 

drop table worker;
drop table workingtime;

CREATE TABLE worker (
 workid varchar(255) not null default '',
 workname varchar(255) not null default ''
);
create table workingtime(
 workid varchar(255) not null default '',
 workinggubun varchar(255) not null default '',
 workingdate datetime not null default '0000-00-00',
 workingtime int not null default 0
);

insert into  worker values ('111111111','A');
insert into  worker values ('222222222','B');

insert into workingtime values ('111111111','null',now() - interval 1 Day,1);
insert into workingtime values ('111111111','null',now() - interval 2 Day,1);
insert into workingtime values ('222222222','null',now() - interval 1 Day,3);
insert into workingtime values ('222222222','null',now() - interval 2 Day,1);
insert into workingtime values ('222222222','null',now() - interval 3 Day,3);
insert into workingtime values ('222222222','null',now() - interval 4 Day,1);


select * from worker;
select * from workingtime;

SELECT now() + interval 1 Day


 
SELECT
 workid, workname,
 if(column_A is null, 0, column_A) as column_A,
 if(column_B is null, 0, column_A) as column_B,
 if(column_C is null, 0, column_A) as column_C
FROM
( SELECT T2.workid, T2.workname,
 sum(CASE T2.DayDiff WHEN 1 THEN T2.summery  END) as 'column_A',
 sum(CASE T2.DayDiff WHEN 2 THEN T2.summery  END) as 'column_B',
 sum(CASE T2.DayDiff WHEN 3 THEN T2.summery  END) as 'column_C'
from (
 SELECT workid, workname, DayDiff, sum(workingtime) as summery
  FROM (
   SELECT A.workid, A.workname, datediff(now(),workingdate) as DayDiff, workingtime
   FROM worker A inner join workingtime B on A.workid=B.workid ) T1
 group by workname, DayDiff ) T2
group by T2.workid, T2.workname) as T3

 

박성원(darkancia)님이 2013-04-29 14:37에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
30585트랜젝션 [1]
기훈
2013-05-05
8576
30584mysql 5.6.10 에서 old_password 접속문제 [1]
김곤
2013-05-03
9265
30583FLOOR 함수 문의 [5]
강삼수
2013-05-02
9233
30582기간별 작업시간 구하기 [1]
왕초보
2013-04-17
9364
30581정렬 문제입니다. [1]
zzin
2013-04-17
8488
30580show status 원격서버 에서 실행. [1]
배원준
2013-04-12
9847
30579[mysql 방화벽거쳐 원격접속 질문] [1]
ttlove
2013-04-05
10250
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.028초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다