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 30336 게시물 읽기
No. 30336
쿼리 재질문드립니다.(박현우님)^^;
작성자
다중이
작성일
2012-10-12 17:37ⓒ
2012-10-16 19:17ⓜ
조회수
10,209

테이블명 ctbl

cid officecode wcount pname init_pval init_rval
1 종로점 1 사과 0 0
2 종로점 1 딸기 0 0
3 종로점 1 수박 0 0
4 종로점 2 사과 1.5 1.3
5 종로점 2 딸기 1.2 1.1
6 종로점 2 수박 2.1 2
7 종로점 2 멜론 0 0

 

테이블명 : wtbl

pid officecode wcount weeknumber sdate edate
1 종로점 1 1 2012-10-01 2012-10-07
2 종로점 1 2 2012-10-08 2012-10-14
3 종로점 2 3 2012-10-15 2012-10-21
4 종로점 2 4 2012-10-22 2012-10-28

 

테이블명 : ptbl

psid officecode weeknumber pname pval rval
1 종로점 1 사과 0.5 0.3
2 종로점 1 딸기 0.3 0.2
3 종로점 1 수박 0.4 0.4
4 종로점 2 사과 1 0.9
5 종로점 2 딸기 0.9 0.7
6 종로점 2 수박 0.5 0.4
7 종로점 3 사과 0.5 0.4
8 종로점 3 딸기 0.5 0.5
9 종로점 3 수박 0.7 0.6
10 종로점 3 멜론 0.2 0.1
11 종로점 4 사과 0.7 0.1
12 종로점 4 딸기 0.3 0.4
13 종로점 4 수박 0.5 0.5
14 종로점 4 멜론 0.4 0.2

 

  

위와같은 테이블에서 아래와 같은 표를 만들고 싶습니다.

NO 차수 기간 지난주 금주
계획 실적 계획 실적
4 2 2012-10-22~2012-10-28 6.7 6.0 1.9 1.2
3 2 2012-10-15~2012-10-21 4.8 4.4 1.9 1.6
2 1 2012-10-08~2012-10-14 1.2 0.9 2.4 2.0
1 1 2012-10-01~2012-10-07 0 0 1.2 0.9

 

1차 의  1번게시물은  지난주 계획, 실적값은 ctbl 테이블를 group by wcount 로 해서 sum(init_pval), sum(init_rval) 값으로 만들어집니다

 2차의 첫번째게시물 (3번게시물)도 같은 방법으로 채워집니다.

 4번게시물은  

3번게시물의 지난주 계획값 + 3번게시물의 금주 계획값 = 4번 게시물의 지난주 계획값

3번게시물의 지난주 실적값 + 3번게시물의 금주 실적값 = 4번 게시물의 지난주 실적값

이렇게 보이게끔 하려 합니다.

 

레코드가 쌓이거나 아님 차수가 변경되어도 위와 같은 방법으로 표현을 하려하려 합니다. 

 

이전까지는 루프안에서 IF절로 제어해서 출력을 했는데 한번의 쿼리로 변경하고 싶습니다.

(루프안에 대여섯개의 쿼리문이 존재해서 속도가 많이 느립니다)

 

생각처럼 어렵지 않을꺼 같아서 여러 조인과 셀프조인을 이용해봤으나 원하는 값이 안나오네요... ㅜㅜ

테이블 설계가 잘못된건가요?

 

이전에도 큰 도움을 받았는데 이번에도 절실합니다.

이 쿼리때문에 5일동안 진도를 못나가 무례를 무릅쓰고 이렇게 다시 질문 올립니다.

감사합니다.

 

http://sqlfiddle.com/#!2/35bda

 

 

 

 

CREATE TABLE `ctbl` (

  `cid` int(8) NOT NULL AUTO_INCREMENT,

  `officecode` varchar(64) NOT NULL,

  `wcount` int(3) NOT NULL,

  `pname` varchar(20) NOT NULL,

  `init_pval` float(6,1) NOT NULL DEFAULT '0.0',

  `init_rval` float(6,1) NOT NULL DEFAULT '0.0',

  PRIMARY KEY (`cid`)

);

 

insert into ctbl values ('1','종로점','1','사과','0','0');

insert into ctbl values ('2','종로점','1','딸기','0','0');

insert into ctbl values ('3','종로점','1','수박','0','0');

insert into ctbl values ('4','종로점','2','사과','1.5','1.3');

insert into ctbl values ('5','종로점','2','딸기','1.2','1.1');

insert into ctbl values ('6','종로점','2','수박','2.1','2.0');

insert into ctbl values ('7','종로점','2','멜론','0','0');

 

 

CREATE TABLE `wtbl` (

  `pid` int(8) NOT NULL AUTO_INCREMENT,

  `officecode` varchar(64) NOT NULL,

  `wcount` int(3) NOT NULL,

  `weeknumber` int(3) NOT NULL,

  `sdate` date NOT NULL,

  `edate` date NOT NULL,

  PRIMARY KEY (pid)

);

 

insert into wtbl values ('1','종로점','1','1','2012-10-01','2012-10-07');

insert into wtbl values ('2','종로점','1','2','2012-10-18','2012-10-14');

insert into wtbl values ('3','종로점','2','3','2012-10-15','2012-10-21');

insert into wtbl values ('4','종로점','2','4','2012-10-22','2012-10-28');

 

 

CREATE TABLE `ptbl` (

  `psid` int(9) NOT NULL AUTO_INCREMENT,

  `officecode` varchar(64) NOT NULL,

  `weeknumber` int(3) NOT NULL,

  `pname` varchar(20) NOT NULL,

  `pval` float(6,1) NOT NULL DEFAULT '0.0',

  `rval` float(6,1) NOT NULL DEFAULT '0.0',

  PRIMARY KEY (`psid`)

);

 

 

insert into ptbl values ('1','종로점','1','사과','0.5','0.3');

insert into ptbl values ('2','종로점','1','딸기','0.3','0.2');

insert into ptbl values ('3','종로점','1','수박','0.4','0.4');

insert into ptbl values ('4','종로점','2','사과','1.0','0.9');

insert into ptbl values ('5','종로점','2','딸기','0.9','0.7');

insert into ptbl values ('6','종로점','2','수박','0.5','0.4');

insert into ptbl values ('7','종로점','3','사과','0.5','0.4');

insert into ptbl values ('8','종로점','3','딸기','0.5','0.5');

insert into ptbl values ('9','종로점','3','수박','0.7','0.6');

insert into ptbl values ('10','종로점','3','멜론','0.2','0.1');

insert into ptbl values ('11','종로점','4','사과','0.7','0.1');

insert into ptbl values ('12','종로점','4','딸기','0.3','0.4');

insert into ptbl values ('13','종로점','4','수박','0.5','0.5');

insert into ptbl values ('14','종로점','4','멜론','0.4','0.2');

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

 sqlfiddle.com/#!2/35bda/27

 

실수 정확도가 좀 다르게 나오는 문제가 있는데 실 사용시에는 무리가 없을 것으로 보입니다.

하지만 여전히 좀 깔끔하지는 않은 듯 싶네요.

 

SELECT @prev_wcount := 0, @sum_pval := 0.0, @sum_rval := 0.0;

SELECT 
  x.weeknumber, x.wcount, x.sdate, x.edate,
  ( @sum_pval := IF( @prev_wcount != x.wcount, y.init_pval, @sum_pval ) ) AS prev_pval,
  ( @sum_rval := IF( @prev_wcount != x.wcount, y.init_rval, @sum_rval ) ) AS prev_rval,
  x.pval, 
  x.rval,
  @sum_pval := @sum_pval + x.pval,
  @sum_rval := @sum_rval + x.rval,
  @prev_wcount := x.wcount

FROM

( SELECT 
    w.weeknumber, w.wcount, w.sdate, w.edate, 
    SUM(p.pval) AS pval, SUM(p.rval) AS rval
  FROM wtbl AS w
    LEFT JOIN ptbl AS p ON w.weeknumber = p.weeknumber
  GROUP BY w.weeknumber
) x

LEFT JOIN

( SELECT
    wcount, SUM(init_pval) AS init_pval, SUM(init_rval) AS init_rval
  FROM ctbl
  GROUP BY wcount
) y ON x.wcount = y.wcount
;

 

박현우(lqez)님이 2012-10-13 10:26에 작성한 댓글입니다.
이 댓글은 2012-10-13 10:27에 마지막으로 수정되었습니다.

박현우님....

감사합니다..^^

알려주신 쿼리..

제가 생각했던 쿼리보다 복잡했네요..!!

실수값은 format() 이용했는데 말씀대로 실 사용에는 큰 문제가 없을듯 합니다.

저는 언제 이 경지에 오를까요..?

감사합니다..!!

현우님 덕분에 상쾌한 월요일 아침이 되었습니다..

다시 한번 감사합니다..!!

다중이님이 2012-10-15 09:02에 작성한 댓글입니다.
이 댓글은 2012-10-15 09:04에 마지막으로 수정되었습니다. Edit

 엊그저께 여기에 추가 질문 달아주시지 않으셨었나요? 마침 sqlfiddle이 접속이 잘 안되서 나중에 봐야지 했었는데...

박현우(lqez)님이 2012-10-19 11:00에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
30339select 문에서 데이터 중 일별 마지막 데이터만 가져오기 [1]
임정미
2012-10-24
11291
30338고등학교 학적관리프로그램 db설계 문의합니다. [1]
이정민
2012-10-22
8616
30337mysql5 테이불 필드명을 한글로해도 되는지요 [2]
김길동
2012-10-14
10155
30336쿼리 재질문드립니다.(박현우님)^^; [3]
다중이
2012-10-12
10209
30335federated engine 테이블에 트리거 가능한가요? [1]
233
2012-10-09
8425
30334한달중에 화요일의 날자와 몇주차인지 알고싶어요! [1]
권순환
2012-10-08
9818
30333연속 로그인(3일 연속) 한 회원수 뽑아내는 쿼리 문의드립니다. [3]
원도재
2012-10-05
11869
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.017초, 이곳 서비스는
	PostgreSQL v16.4로 자료를 관리합니다