我有2个表,1Poolwaitingexchange和VA05(ZRAX),如下面的链接所示。
http://i.stack.imgur.com/FN9tM.png
我需要来自VA05(ZRAX)的[Vcat],并且2个表格之间的关系来自[Material Code] - > [Description1]和[Cust PO] - > [采购订单编号](也在链接中显示)
唯一的问题是,对于每一个[材料代码]& [Cust PO],可能有不同[Vcat]的重复项,这意味着除了[Vcat]之外所有字段都相同,我希望记录具有最低的Vcat但不是零。
EG。如果重复记录有[Vcat] 0,1,2,3,我想选择显示[Vcat]为1的记录。
如果记录只有[Vcat] 0,我希望它显示[Vcat]为0的记录
如果[Vcat]为空,则返回[Vcat]为空白的记录。
唯一独特的记录是表1中的[Notif#],我尝试了很多不同的方法,例如分组[Notif#],首先是每个重复字段,MIN是[Vcat],但我只是可以'得到我想要的价值。
我的SQL知识不存在,我做了很多试验和错误我希望有人可以帮我解决这个问题。
答案 0 :(得分:0)
您有三种情况可以UNION
在一起。有人会毫不怀疑地提出一个SELECT
来完成所有这三项IFF
和OR
s,但您可能会发现UNION
方法更容易理解,特别是如果你不了解SQL。
我为了方便起见改变了一些名字,我使用了-999
,因为我避免使用空值:
SELECT p.Material_Code, p.Cust_PO, 1 AS VCat
FROM Pool p
WHERE EXISTS ( SELECT *
FROM VARAX v
WHERE v.Material_Code = p.Material_Code
AND v.Cust_PO = p.Cust_PO
AND v.Vcat > 0 )
UNION
SELECT p.Material_Code, p.Cust_PO, 0 AS VCat
FROM Pool p
WHERE EXISTS ( SELECT *
FROM VARAX v
WHERE v.Material_Code = p.Material_Code
AND v.Cust_PO = p.Cust_PO
AND v.Vcat = 0 )
AND NOT EXISTS ( SELECT *
FROM VARAX v
WHERE v.Material_Code = p.Material_Code
AND v.Cust_PO = p.Cust_PO
AND v.Vcat > 0 )
UNION
SELECT p.Material_Code, p.Cust_PO, -999 AS VCat
FROM Pool p
WHERE NOT EXISTS ( SELECT *
FROM VARAX v
WHERE v.Material_Code = p.Material_Code
AND v.Cust_PO = p.Cust_PO );
答案 1 :(得分:0)
听起来像你想要这样的东西。不幸的是,我目前无法测试我的Access语法。 (我也假设“空白”实际上是空的。如果没有,请澄清Vcat
的数据类型。)
select
pwe.[Cust PO], pwe.[Part Number],
switch(
not isnull(min(switch(Vcat between 1 and 3, Vcat))),
min(switch(Vcat between 1 and 3, Vcat))
min(Vcat) = 0, 0, true, null
) as Vcat
from
1Poolwaitingexchange as pwe inner join VA05 as va
on va.[PO Number] = pwe.[Cust PO] and va.Description = pwe.[Part Number]
group by pwe.[Cust PO], pwe.[Part Number]
你说我的逻辑原本是坏的。至少为零总是取代1到3之间的合法值。修改后的版本通过使用将该范围之外的值视为空值的逻辑来处理,因此可以忽略min
聚合。
您可以使用下面稍短的版本。这三个人都有一个共同的英语解释:“是否有1到3之间的值?然后返回最小的一个。”我认为后两者阅读得更好,但我不知道你是否会添加其他可能破坏它们的值。由于我不知道Vcat
的性质以及它们如何改变,我会把它留给你。
switch(
max(Vcat) > 0, min(switch(Vcat between 1 and 3, Vcat))
min(Vcat) = 0, 0,
true, null
) as Vcat
switch(
max(Vcat) between 1 and 3, min(switch(Vcat between 1 and 3, Vcat))
min(Vcat) = 0, 0,
true, null
) as Vcat
答案 2 :(得分:0)
不要直接加入VA05(ZRAX),而是尝试按照您想要的方式加入VA05(ZRAX)中行的查询结果。您可以使用两个子查询对包含和不包含零的最小值进行分组。
因此,您将有另一个名为qry_va05zrax_toPool_min的查询
select
[po number], description,
vcatmin:min(vcat)
from VA05(ZRAX)
group by
[po number],description
和qry_va05zrax_toPool_minGT0:
select
[po number], description,
vcatminGT0:min(vcat)
from VA05(ZRAX)
group by
[po number],description
having vcat > 0
和以下两者的第三个:
select
[po number], description, vcatVal:iif(vcatminGT0 is not null, vcatminGT0,iif(vcatmin is not null, 0, null) )
from
1poolWaitingExchange p left outer join
qry_va05zrax_toPool_min m on
p.[po number] = m.[po number] and
p.description = m.description left outer join
qry_va05zrax_toPool_minGT0 z on
p.[po number] = z.[po number] and
p.description = z.description