2010-07-21 4 views
1

'그룹화'를 사용하여 쿼리에서 항목을 중복 :제외 내가 세 개의 테이블이

내가 쿼리하고자하는 항목이 고객에게 단일 배달하는 파트너에 의해 전달 된 이는
table 'received' 
------------------ 
partner_id int 
item_id int 

table 'delivered' 
------------------ 
item_id int 
delivery_date date 
customer_id int 

table 'partners' 
------------------ 
id int 
name text 

table 'customers' 
------------------ 
id int 
name text 

. 때로는 서로 다른 파트너가 동일한 항목을 전달하기 때문에 전달 된 항목에 속임수가 포함되어 있지 않아야 필터링 할 수 있습니다.

select 
    partner_id, 
    count(distinct item_id) 
from 
    received 
where item_id in 
    (select distinct item_id from delivered where delivery_date = '2010-07-14' and customer_id = 1) 
group by partner_id; 

그러나이 나에게 파트너가 제공 한 속는 포함한 모든 전달 항목을 제공 : 내가 함께 왔어요 무엇

이있다. 나는 이것을 오랫동안 생각해 왔으며, 'except', 'having'등을 사용하여 sub-select를 시도했지만 나에게 더 많은 것을 얻은 점을 얻지 못했습니다.

나는 올바른 방향으로 어떤 힌트를 주면 좋을 것입니다. 고맙습니다.

:

item_id | delivery_date | customer_id 
--------|---------------|------------ 
1  | 2010-07-14 | 1 
2  | 2010-07-14 | 1 
3  | 2010-07-14 | 1 

전류 출력은

partner_id | item_id 
-----------|--------- 
1   | 1 
1   | 2 
2   | 1 
2   | 3 

테이블을 '접수' '전달'

테이블 :

- - 편집 여기

몇 가지 샘플 데이터입니다

partner | amount 
--------|------ 
1  | 2 
2  | 2 

원하는 출력은 다음과 같습니다 ID 2와 파트너가 이미 업데이트 이후 파트너 1.

답변

1
select 
    partner_id, count(distinct item_id) 
from 
    received join delivered using (item_id) 
where 
    delivery_date = '2010-07-14' and customer_id = 1 
group by partner_id; 

에 의해 전달 된 항목을 제공하고 있기 때문에

partner | amount 
--------|------ 
1  | 2 
2  | 1 

, 문제가하지 않는 것 잘 정의되어 있어야한다. 한 고객에 대해 항목 1이 계산되고 다른 한 표에 계산되지 않는 이유는 무엇입니까? 두 사람이 모두 그것을 배달했다면, 왜 그 사람 중 한 사람 만 집계 되었습니까?

당신은 좋아하는 시도 할 수 :

select 
    partner_id, count(distinct item_id) 
from (
    select distinct on (item_id) partner_id, item_id 
    from received join delivered using (item_id) 
    where delivery_date = '2010-07-14' and customer_id = 1 
    order by item_id, partner_id 
) 
group by partner_id; 
+0

감사합니다.하지만이 쿼리는 여전히 모든 중복 항목을 제공합니다. – fucx

+1

샘플 데이터 또는 테이블 덤프를 추가 할 수 있습니까? 아니면 예상되는 출력? 정확하게 여기에 정확히 무엇이 있는지 나는 잘 모르겠습니다. –

+0

샘플 데이터와 예상 출력을 추가했습니다. 정확한 문제가 무엇인지 명확하게하기를 바랍니다. – fucx

0

당신은 하나 개의 파트너에게 각각 전달을 할당하기위한 이유가 있어야합니다. 귀하의 예에서, 당신은 낮은 숫자에 그것을 할당하기로 결정했습니다. (

:

그런 다음 전달 된 테이블에 제공하는 파트너의 partner_id를 추가 rec_assign (선택 분 (partner_id) partner_id, ITEM_ID에받은 그룹에서 ITEM_ID) :이 같은 일이 있다고 할 것 del_mod로 delivered.item_id = rec_assign.item_id))에 rec_assign있다. 전달 선택 * 전달 내부 조인 발 rec_assign.partner_id (선택 분 (partner_id) partner_id가 ITEM_ID에서 수신 한 그룹으로부터 ITEM_ID)

이제 간단

select partner_id, ()에서 (선택 배달.는 전달 내부에서 합류 rec_assign.partner_id partner_id

I partner_id 의해 순서대로 del_mod delivered.item_id = rec_assign.item_id))에 rec_assign 기 (선택 분 (partner_id) partner_id는 ITEM_ID에서 수신 한 그룹으로부터 ITEM_ID) 그렇게해야한다고 생각합니다. 어리석은 실수를 법으로합니다.

관련 문제