在合同表中查找特定客户

时间:2014-01-14 19:01:50

标签: sql

我正在使用MS SQL,需要帮助创建查询。

我有一个名为CustomerContracts的表,其中每个项目#为特定客户多行。

例如真实数据

item      cust_num
x      1156
x      3924
x      7565
x     84339
x    104365
x    106066
x    107377
x    118691
y      1156
y      3924
y      7565
y     84339
y    104365
y    106066
y    107377

所以我需要做的是按项目编号和特定客户编号搜索表格,如果该客户编号不存在作为该项目的记录,则返回该项目。

所以,在这种情况下,如果项目不包含两个客户,我正在检查cust_num 106066和118691的所有项目记录,然后我希望它包含在我的结果中,因此在此原因项目X不会显示,但项目Y会。

我想我需要做一些计数。我尝试过使用NOT IN(002,003)没有运气。

连连呢?

满足我对此的尝试。我尝试了至少8种不同的方式,这是最新的尝试。

select 'Cust Does not exist' as Status,
    i.item as item,
    i.description as description,
    t.numcusts

From
    item i inner join (select count(cust_num) as numcusts,item
                        from itemcust
                        where cust_num NOT IN ('106066','118691')
                        group by item) t on t.item = i.item

where i.stat = 'A' and t.numcusts > 0
order by i.item,i.description

没用。所以,我仍在努力解决它。我能够在Access中使用嵌入式查询开发一种解决方案,但无法将其创建的sql移植到端口。

2 个答案:

答案 0 :(得分:0)

我猜你有一个客户的多条记录。您希望客户表中没有给定项目的记录。一种方法是使用group byhaving

select cc.cust_num
from CustomerContracts cc
where c.cust_num in ('001', '002')
group by cc.cust_num
having sum(case when cc.cust_item_num in ('aaa') then 1 else 0 end) = 0;

另一种方法是使用not exists

select cc.*
from CustomerContract cc
where c.cust_num in ('001', '002') and
      not exists (select 1 from CustomerContracts where cust_item_num in ('aaa'));

第一个列出了客户编号。第二个给出了这些客户的所有记录。

编辑(基于编辑问题):

问题是关于物品而不是顾客。对第一种方法的修改将起作用。如果您只想要至少拥有一个客户的项目,请使用where子句:

select cc.cust_item_num
from CustomerContracts cc
where c.cust_num in (106066, 118691)
group by cc.cust_item_num
having count(distinct c.cust_num) < 2;

如果您想要所有商品(即使客户不在哪里),请在having子句中单独计算每个客户匹配:

select cc.cust_item_num
from CustomerContracts cc
group by cc.cust_item_num
having sum(case when c.cust_num = 106066 then 1 else 0 end) = 0 or
       sum(case when c.cust_num = 118691 then 1 else 0 en) = 0;

答案 1 :(得分:0)

感谢您的帮助,但经过5杯咖啡和2个播放列表后,我想出来了

select 'Cust Does not exist' as Status,
i.item as item,
i.description as description,expr1

From
item i RIGHT join (select itemcust.item,
sum(case when LTRIM(RTRIM(cust_num)) = '106066' or LTRIM(RTRIM(cust_num)) ='118691'then   1 else 0 end) as expr1
from itemcust
group by itemcust.item) t on t.item = i.item

where i.stat = 'A' AND expr1 <> 2
order by i.item,i.description

这给了我所有没有记录或实际上不止一次的项目。