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 29732 게시물 읽기
No. 29732
이런 쿼리가 가능할런지.. 도움부탁드립니다.
작성자
눈물꼬마(nmccm)
작성일
2010-07-19 18:55
조회수
7,378

Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 535406
Server version: 5.0.45 Source distribution

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> select * from plist

+--+-----+-----+-------+
|no| pid | cnt | price |
+--+-----+-----+-------+
|1 | A  | 10  | 100  |
+--+-----+-----+-------+
|2 | A  | 10  | 200  |
+--+-----+-----+-------+
|3 | B  | 15  | 150  |
+--+-----+-----+-------+
|4 | B  | 15  | 250  |
+--+-----+-----+-------+


mysql> select * from pnow
 
+-----+-----+
| pid | cnt |
+-----+-----+
| A  | 11  |
+-----+-----+
| B  | 20  |
+-----+-----+

테이블 구조가 이렇습니다.
현재 재고수만큼 재고자산을 구하고 싶은데 어떻게 쿼리를 넣어야 할지 모르겠습니다.
즉 위의 데이터를 참고하여 pid 가 A 인것의 자산을 구하자면 no 가 2 번인 10개보다 현재의 수량이 많기 때문에 2000 을 모두 포함하고,
no 가 1 번인 10개단 작기때문에 100만 포함하여 2100 을 구하고 싶습니다.

pid 가 B 인 녀석도 마찬가지입니다...
4번의 수량보다 현재의 수량이 많기 때문에 (15 * 250 = ) 3750 을 모두 포함하고,
no 가 3 번인 15개보단 수량이 적기 떄문에 (5 * 150 = ) 750 을 포함하여 4500 을 구하고 싶습니다.

그럼 원하는 쿼리내용은 아래와 같습니다.

+-----+-----+-------+
| pid | cnt | price |
+-----+-----+-------+
| A  | 11  | 2100  |
+-----+-----+-------+
| B  | 20  | 4500  |
+-----+-----+-------+

몇일을 고민해보았지만 제 머리로는 도저히 못하겠어서 도움구합니다.

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

조건명시가 애매한것 같습니다.

4번의 수량보다 현재의 수량이 많기 때문에 (15 * 250 = ) 3750 을 모두 포함하고,

=> 3번도 마찬가지인데 4번을 먼저포함하는 이유가 없습니다.

 

php3주차(kimpro)님이 2010-07-21 16:17에 작성한 댓글입니다.

 

버전업된 MYSQL에서 함수가 추가된다면 모를까 그냥 쿼리로는 안될꺼 같고여.

그냥 프로시저 한번 만들어 봤습니다.

Create Table PLIST
(
 PID VARCHAR(10),
 CNT INT(11),
 PRICE INT(11)
);

INSERT INTO PLIST(PID,CNT,PRICE) VALUES('A',10,100);
INSERT INTO PLIST(PID,CNT,PRICE) VALUES('A',10,200);
INSERT INTO PLIST(PID,CNT,PRICE) VALUES('B',15,150);
INSERT INTO PLIST(PID,CNT,PRICE) VALUES('B',15,250);


CREATE TABLE PNOW
(
 PID VARCHAR(10),
 CNT INT(11)
);
INSERT INTO PNOW(PID,CNT) VALUES('A',11);
INSERT INTO PNOW(PID,CNT) VALUES('B',20);

CREATE PROCEDURE SP_AAA(
)
begin
  CREATE TEMPORARY TABLE TEMP_PLIST
  (
    PID VARCHAR(10),
    CNT INT(11),
    PRICE INT(11),
    SUMCNT INT(11),
    TOTCNT INT(11)
  );

  INSERT INTO TEMP_PLIST(SUMCNT,PID,CNT,PRICE,TOTCNT)
  Select @rnum:=(CASE WHEN @preid = y.PID then @rnum Else 0 End) + y.CNT
   ,@preid:=y.PID,y.CNT,y.PRICE,y.TOTCNT
  From (Select @rnum:=0,@preid:='') as x, (
   Select A.PID,A.CNT,A.PRICE,B.CNT as TOTCNT
   From PLIST A
       INNER JOIN PNOW B ON (A.PID = B.PID )
   ORDER BY A.PID,A.PRICE DESC
  ) y;

  SELECT PID,MAX(TOTCNT) AS TOTCNT,
         SUM(( CASE WHEN TOTCNT > SUMCNT THEN CNT ELSE TOTCNT - SUMCNT + CNT END ) * PRICE) AS AMT
  FROM TEMP_PLIST
  GROUP BY PID;

end;

결과 )

A 11 2100
B 20 4500

이정재님이 2010-07-22 15:21에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
29737오라클에서 to_char(25,'00000')와 같은 MySql은?? [1]
유춘상
2010-07-26
8923
29735한글 자소단위 검색( 검색 제시어 기능 구현...) [2]
Deck
2010-07-23
8094
29733database 생성이 안됩니다. [1]
최승우
2010-07-19
7002
29732이런 쿼리가 가능할런지.. 도움부탁드립니다. [2]
눈물꼬마
2010-07-19
7378
29730mysql 복구시 [1]
이양욱
2010-07-16
7529
29729조회가 안되요 [1]
윤은숙
2010-07-16
7160
29728replication 사용 시 my.cnf 파일 위치 지정 [1]
최영균
2010-07-14
7271
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.018초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다