2012-04-10 5 views
0

확인을 눌러 두 번째 시도를 시도합니다. 두 번째로 읽는 사용자에게 문제를 이해하기에 충분할 것으로 기대합니다.행을 쿼리하고 추가합니다.

보고서에 대한 쿼리를 개발 중입니다. 데이터베이스에서 데이터를 검색하는 동안이 보고서는 존재하지 않는 일부 행을 채워야합니다. 설명의 목적을 위해 나는이 테이블을 가지고 있다고 말할 수 있습니다.

Table 1 - Companies 

Table 2 - Transactions. 

Table 3 - Transaction types. 

대부분의 회사는 모든 트랜잭션 유형의 트랜잭션을 가지고 있지 않습니다. 보고서 논리는 모든 회사가 실제 현금 가치가있는 "실제"값을 가진 회사와 $ 0의 가격이 아닌 다른 회사를 표시해야합니다. 트랜잭션 유형이 논리적 그룹으로 결합되어 있기 때문에 문제가 여기에서 시작됩니다. 따라서 회사가 type_1의 실제 거래가 1 개만있는 경우 보고서에는 type_1, type_3 및 type_4와 같은 다른 유형의 '$ 0'레코드가 포함되어야합니다. 회사에 type_1 및 type_2 트랜잭션이있는 경우 보고서에는 다른 트랜잭션 유형 그룹의 다른 트란 유형이 채워져 있어야합니다.

여기에서 문제가되는 것은 실행해야하는 환경이 순수한 sql 프로그래머 나는 데이터베이스를 쿼리하는 것이 얼마나 쉬운 지 이해하고 배열 [] []에 데이터를로드하고 누락 된 트랜잭션 유형을 추가하십시오.) 그러나 쿼리는 UNIX에서 plsql 배치 내에서 실행되어야하므로 단일 (또는 조인 된) select 여야합니다.

미리 감사드립니다. 어떤 도움이나 아이디어라도 높이 평가 될 것입니다!

답변

0

두 개의 하위 쿼리 하나를 사용하여 회사에있는 기존 유형을 기준으로 회사 당 모든 트랜잭션을 찾을 수 있습니다. 두 번째 하위 쿼리는 두 번째로 합계를 찾습니다.

SELECT companies.id, all_transactions.transaction, COALESCE(sums.total_amount, 0) 
FROM companies 
JOIN (SELECT ct.companyid, t.transaction 
    FROM transactions ct 
    JOIN transactions t ON t.transactiontype = ct.transactiontype 
    GROUP BY ct.companyid, t.transaction) all_transactions ON all_transactions.companyid = companies.companyid 
LEFT JOIN (SELECT ct.companyid, SUM(t.amount) as total_amount 
    FROM transactions ct 
    GROUP BY ct.companyid) sums ON sums.companyid = companies.companyid 
1

외부 결합이 필요합니다. 나는 테이블이 서로 어떻게 관련되는지에 같은데요하지만 당신은 모든 거래 유형에 대한 모든 회사와 관련된 거래의 합 (또는 0의 경우에 대해 하나 개의 행을 생산한다

SELECT c_typ_cross_join.company_name, 
     c_typ_cross_join.transaction_type, 
     nvl(sum(t.transaction_amount), 0) total_amt 
    FROM (SELECT c.company_name, 
       typ.transaction_type 
      FROM companies c 
       FULL OUTER JOIN transaction_type typ) c_typ_cross_join 
     LEFT OUTER JOIN transactions t ON ( c_typ_cross_join.company_id  = t.company_id 
              AND c_typ_cross_join.transaction_type = t.transaction_typ) 
GROUP BY c_typ_cross_join.company_name, 
      c_typ_cross_join.transaction_type 

이 뭔가를 원하는 것으로 보인다 회사와 거래 유형의 조합에 대한 거래는 없습니다).

+0

얘들 아, 너 정말 대단하다.하지만 나는 총계가 있어야한다는 것을 전혀 언급하지 않았다. 그것은 단지 모든 트랜잭션 목록이어야한다. – user1324100

+1

@ user1324100 - 프랭크 (Frank)는 OTN https://forums.oracle.com/forums/thread.jspa?threadID=2373681&tstart=0에서이 질문을 한 시점에서 테이블 구조, 샘플 데이터 등을 게시하는 것이 매우 유용 할 것이라고 지적했습니다. 예상 출력. 그래서 실제 트랜잭션이없는'company_name'과'transaction_type'의 조합에 대해 모든 실제 트랜잭션과 하나의 가짜 트랜잭션을 원하십니까? –

관련 문제