我仍在积极学习MS /sql(需要符合Office 2003 )。我已经尽我所能把事情简化了。
我有下表(Main),包括两个字段(Ax和Ay),它扩展到数千条记录。这是主数据库,需要搜索:
表:主表
Ax Ay
1 6
5 9
3 3
7
5 5
7 2
2
4 4
3
6 5
7 6
等等..。上面的空白条目只是空值。Ax和Ay值可以出现在这两个字段中。
还有一个名为Afull的表,该表包含两个名为Avalid和Astr的字段:
表: Afull
Avalid Astr
1
2
3
4
5
6
7
8
9
字段Astr在每次运行开始时初始化为Null。
此表的第一个用途是将Ax和Ay的所有有效值存储在Avalid字段中。第二个用途是允许用户选择搜索标准。为此,在用户搜索表单中将表Afull作为子窗体添加。然后,用户将任何值>0输入到要搜索的值旁边的Astr中,从而选择要搜索的A有效值。
然后构建一个sql查询字符串,其目的是返回包含用户选择的A有效值的任何“置换”的所有记录:
SELECT Main.Ax,Main.Ay
FROM Main
WHERE (Main.Ax In(uservalues) OR Main.Ax Is Null) AND (Main.Ay In(uservalues) OR Main.Ay Is Null)
“uservalue”转换为要搜索的有效值列表。这是很好的,并按预期工作(双空记录不存在)。
问题:I希望在结果中包含Astr值本身-- Astr值的一个字段和Astr值的一个字段。我尝试了一些方法,包括在SELECT语句中添加以下内容:
strSQL = strSQL & ",IIF((Main.Ax In(uservalues)),Afull.Astr AS Axstr"
strSQL = strSQL & ",IIF((Main.Ay In(uservalues)),Afull.Astr AS Aystr"
strSQL = strSQL & "FROM Main,Afull"
...but,这不起作用。是否有相对简单的方法来达到这一点?
最终,我还将使用Astr值对升序进行排序。将Astr视为所选A有效值的“强度”。
发布于 2015-01-01 11:01:09
换句话来说,用户可以选择Ax & Ay的值,您只想返回Ax和Ay都在所选值列表中的记录,或者其中任何一个值可能为null,但不是两者都是空的。
现在,您要为Ax和Ay添加Astr。您可以使用如下所示的与共同相关的子查询,或者您可以两次连接到Afull,一次在Ax = Avalid上,一次在Ay = Avalid上。
如果要构建类似于示例中的SQL字符串,也要检查方括号。
SELECT
Main.Ax,
Main.Ay,
(select Astr from Afull where Avalid = Main.Ax) as AxStr,
(select Astr from Afull where Avalid = Main.Ay) as AyStr
FROM Main
WHERE (Main.Ax In(uservalues) OR Main.Ax Is Null)
AND (Main.Ay In(uservalues) OR Main.Ay Is Null)
发布于 2015-01-01 15:52:54
不管哪种方法在一天结束时起作用,但这里有一种选择,它基本上为第一个计算为true的表达式选择了值。如果A?Str为null或小于零,则使用零值,以便您只需将这两个结果相加。
Switch(AxStr>=0, AxStr,AxStr<0,0,isnull(AxStr),0) + Switch(AyStr>=0, AyStr,AyStr<0,0,isnull(AyStr),0)
发布于 2015-01-01 13:02:34
谢谢你,GB,非常欣赏和完美的工作。问题中缺少的右括号也是固定的,并且Axstr Aystr ->提高了可读性AxStr AyStr注意到(突出强度方面)。
SELECT语句的扩展以获取AxStr+AyStr的总数,即,AxStr+AyStr as TOTAL
只有在各自的Main.Ax和Main.Ay都具有非空值时才能工作。
由于主表中的Null值是可允许的,所以我扩展了SELECT语句以获得AxStr+AyStr的总数,如下所示:
strSQL = strSQL & ",IIF(AxStr>0 AND AyStr>0,AxStr+AyStr,IIF(Main.Ax Is Null,AyStr,
IIF(Main.Ay Is Null,AxStr,0))) AS AStrTOTAL"
https://stackoverflow.com/questions/27732416
复制