我正在使用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移植到端口。
答案 0 :(得分:0)
我猜你有一个客户的多条记录。您希望客户表中没有给定项目的记录。一种方法是使用group by
和having
:
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
这给了我所有没有记录或实际上不止一次的项目。