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
운영게시판
최근게시물
Oracle Q&A 38544 게시물 읽기
No. 38544
분할 배분 하는 쿼리 질문입니다.
작성자
무심도
작성일
2011-05-06 23:28
조회수
5,294

밑에와 같은 데이터가 있습니다.

date work code division
20110506 HR 30
  AL 30
  PL 40
20110507 BQ 20
  PO 10
  AB 50
  SB 20

 

customer
1
2
3
4
5
6
7
8
9
10

 

이 2개의 테이블을 조인해서

밑에와 같은 데이터 값을 만들어야 하는데요.

 

date work code customer
20110506 HR 1
2
3
AL 4
5
6
PL 7
8
9
10
20110507 BQ 1
2
PO 3
4
AB 5
6
7
8
9
SB 10

 

하나의 데이터에는 여러개의 업체와 그 업체의 분할율이 존재 합니다.

이 분할율을 가지고 순차적으로 고객을 배분해야 합니다.

어떻게 해야 하나요.

왠지 머리속에서 떠올를꺼 같은데...안 되네요..ㅠㅠ

 

도와주세요~

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

with t1 as (
select '20110506' dt, 'HR' wcd, 30 div from dual union all
select '20110506'   , 'AL'    , 30     from dual union all
select '20110506'   , 'PL'    , 40     from dual union all
select '20110507'   , 'BQ'    , 20     from dual union all
select '20110507'   , 'PO'    , 10     from dual union all
select '20110507'   , 'AB'    , 50     from dual union all
select '20110507'   , 'SB'    , 20     from dual
),   t2 as (
select 1  cust from dual union all
select 2       from dual union all
select 3       from dual union all
select 4       from dual union all
select 5       from dual union all
select 6       from dual union all
select 7       from dual union all
select 8       from dual union all
select 9       from dual union all
select 10      from dual
)
select dt
     , wcd
     , cust
  from (
         select a.dt
              , a.rn
              , a.wcd
              , b.cust
           from ( select dt, wcd, div
                       , (sum(div)over(partition by dt order by rownum) - div + 10) / 10 fdiv
                       , sum(div)over(partition by dt order by rownum) / 10 ediv
                       , row_number()over(partition by dt order by 1) rn 
                    from t1
                ) a
              , t2 b
          where b.cust >= a.fdiv
            and b.cust <= a.ediv
          order by 1, 2, 4
       )

知音(sunnylee72)님이 2011-05-09 09:27에 작성한 댓글입니다.
이 댓글은 2011-05-09 09:28에 마지막으로 수정되었습니다.

WITH t AS
(
SELECT '20110506' dt, 1 seq, 'HR' work, 30 div FROM dual
UNION ALL SELECT '20110506', 2, 'AL', 30 FROM dual
UNION ALL SELECT '20110506', 3, 'PL', 40 FROM dual
UNION ALL SELECT '20110507', 1, 'BQ', 20 FROM dual
UNION ALL SELECT '20110507', 2, 'PO', 10 FROM dual
UNION ALL SELECT '20110507', 3, 'AB', 50 FROM dual
UNION ALL SELECT '20110507', 4, 'SB', 20 FROM dual
)
, customer AS
(
SELECT LEVEL customer FROM dual CONNECT BY LEVEL <= 10
)
SELECT *
  FROM (SELECT dt, seq, work, div
             , SUM(div) OVER(PARTITION BY dt ORDER BY seq) - div fdiv
             , SUM(div) OVER(PARTITION BY dt ORDER BY seq) ediv
          FROM t
        ) a
     , (SELECT customer
             , SUM(v) OVER(ORDER BY customer) v
          FROM (SELECT customer
                     , 100 / COUNT(*) OVER() v
                  FROM customer
                )
        ) b
 WHERE b.v >  a.fdiv
   AND b.v <= a.ediv
 ORDER BY dt, seq, customer
;

마농(manon94)님이 2011-05-09 11:11에 작성한 댓글입니다.

감사합니다.

많은 도움이 됐습니다.

 

이것을 기초로 쿼리 작성에 많은 도움이 됐습니다.

 

정말 감사합니다.

무심도님이 2011-05-10 14:04에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
38547UNDO가 항상 90%이상에서 안떨어지면?
궁금이
2011-05-12
3055
38546rman backup 옵션? [1]
이재영
2011-05-09
3282
38545ERWIN r7.3 에서 기존에 만든 ERD에 새로운 DB objects만 받을 수 있을까요? [1]
초보
2011-05-09
3588
38544분할 배분 하는 쿼리 질문입니다. [3]
무심도
2011-05-06
5294
38543속도때문에 union을 빼고 싶은데 잘안되네요... 방법이 없을까요? [3]
이재호
2011-05-06
4671
38542파티션 테이블 TRUNCATE 후 INSERT시 에러 [3]
김진국
2011-05-06
5938
38541트리거 3초에 200-300회 작동시 DB 과부하가 일어날까요? [2]
이민수
2011-05-06
5227
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.017초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다