我有三张表:
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',‘have’和其他的分项选择,但还没有达到让我更进一步的地步。
如果有任何正确方向的提示,我将不胜感激。谢谢。
-编辑--
以下是一些示例数据:
表‘已接收’
partner_id | item_id
-----------|---------
1 | 1
1 | 2
2 | 1
2 | 3
表'delivered‘
item_id | delivery_date | customer_id
--------|---------------|------------
1 | 2010-07-14 | 1
2 | 2010-07-14 | 1
3 | 2010-07-14 | 1
当前输出为:
partner | amount
--------|------
1 | 2
2 | 2
所需的输出为:
partner | amount
--------|------
1 | 2
2 | 1
因为ID为%2的合作伙伴已交付已由合作伙伴% 1交付的项目。
发布于 2010-07-21 21:57:52
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;
更新后,您的问题似乎没有得到很好的定义。为什么项目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;
发布于 2010-07-21 23:11:27
您必须有一个将每个交付分配给一个合作伙伴的原因。在您的示例中,您似乎已决定将其分配给较低的数字。你可以这样做:
(select min(partner_id) partner_id,item_id from received group on item_id) rec_assign
然后将交付合作伙伴的partner_id添加到已交付表中:
(select Delified.*,rec_assign.partner_id from delivered内联接(select min(partner_id) partner_id,item_id from received group on item_id) rec_assign on delivered.item_id = rec_assign.item_id) ) as del_mod
现在很简单了
select partner_id,count() from (select Delified.,rec_assign.partner_id from delivered内连接(select min( partner_id ) partner_id,item_id from received group on item_id) rec_assign on delivered.item_id = rec_assign.item_id) ) as del_mod group by partner_id order by partner_id
我认为这应该可以做到这一点,模愚蠢的错误。
https://stackoverflow.com/questions/3299941
复制相似问题