【问题标题】:IIF Function (Access)IIF 功能(访问)
【发布时间】:2012-06-19 22:13:15
【问题描述】:

有任何 Access 大师可以帮助我吗?试图弄清楚如何实现以下目标:我想要一个查询遍历个人表中的每个人,并返回那些在圣诞节列表字段中具有真实值的人。该数据库很旧,并且是使用 CompanyName 作为公司表的主键创建的(我知道 - 设计不佳)。为了让一家公司拥有多个地点,他们创建了一个地址栏字段。这样,如果“Y 公司”在圣地亚哥开设新位置,他们会添加“Y 公司 - 圣地亚哥”条目并在地址行中输入“Y 公司”。然后对于没有公司的个人,将他们输入到“Home”的虚拟公司条目中。所以理想情况下,我希望这个查询做的是循环,抓住所有应该在圣诞节名单上的人,如果地址栏字段 ISN'T NULL 我希望 CompanyName 等于 AddressLine,但如果 CompanyName = " Home" 我希望 CompanyName 等于 ""(空字符串)。还有一些人有隔夜地址,因为他们的正常地址是邮政信箱。以下查询我主要为我工作,但是如果 CompanyName="Home",我不清楚如何在返回的结果中将公司名称设为空白。

SELECT tblIndividuals.FirstName, tblIndividuals.LastName, IIf([tblcompanies].[addressline] Is Not Null,[tblcompanies].[addressline],[tblcompanies].[companyname]) AS CompanyName, IIf([tblIndividuals].[MailingAddress1] Is Null,[tblCompanies].[MailingAddress1],[tblIndividuals].[MailingAddress1]) AS MailingAddress1, IIf([tblIndividuals].[MailingAddress1] Is Null,[tblCompanies].[MailingAddress2],[tblIndividuals].[MailingAddress2]) AS MailingAddress2, IIf([tblIndividuals].[MailingAddress1] Is Null,[tblCompanies].[MailingAddress3],[tblIndividuals].[MailingAddress3]) AS MailingAddress3, IIf([tblIndividuals].[MailingAddress1] Is Null,[tblCompanies].[MailingAddress4],[tblIndividuals].[MailingAddress4]) AS MailingAddress4, IIf([tblIndividuals].[MailingAddress1] Is Null,[tblCompanies].[City],[tblIndividuals].[City]) AS City, IIf([tblIndividuals].[MailingAddress1] Is Null,[tblCompanies].[State],[tblIndividuals].[State]) AS State, IIf([tblIndividuals].[MailingAddress1] Is Null,[tblCompanies].[Zip],[tblIndividuals].[Zip]) AS Zip
FROM tblIndividuals INNER JOIN tblCompanies ON tblIndividuals.CompanyName = tblCompanies.CompanyName
WHERE (((tblIndividuals.ChristmasList)=True))
Order by [tblIndividuals].[companyname];

如果可能的话,我希望它按公司名称值 (A-Z) 排序,然后按个人的姓氏 (A-Z) 排序。我不会假装精通 SQL,所以您能给我的任何帮助将不胜感激。感谢您的时间。

【问题讨论】:

    标签: ms-access iif


    【解决方案1】:

    考虑一个 UNION 查询,例如:

    SELECT i.FirstName, i.LastName, 
           IIf(c.[addressline] Is Not Null,
               c.[addressline],c.[companyname]) AS CompanyName, 
           c.[MailingAddress1] AS MailingAddress1, 
           c.[MailingAddress2] AS MailingAddress2, 
           c.[MailingAddress3] AS MailingAddress3, 
           c.[MailingAddress4] AS MailingAddress4, 
           c.[City] AS City, 
           c.[State] AS State,
           c.[Zip] AS Zip
    FROM tblIndividuals i
    INNER JOIN tblCompanies c ON i.CompanyName = c.CompanyName
    WHERE i.ChristmasList=True
    AND i.[MailingAddress1] Is Null
    UNION
    SELECT i.FirstName, i.LastName, 
           IIf(c.[addressline] Is Not Null,c.[addressline],
               c.[companyname]) AS CompanyName, 
           i.[MailingAddress1] AS MailingAddress1, 
           i.[MailingAddress2] AS MailingAddress2, 
           i.[MailingAddress3] AS MailingAddress3, 
           i.[MailingAddress4] AS MailingAddress4, 
           i.[City] AS City, 
           i.[State] AS State,
           i.[Zip] AS Zip
    FROM tblIndividuals i
    INNER JOIN tblCompanies c ON i.CompanyName = c.CompanyName
    WHERE i.ChristmasList=True
    AND i.[MailingAddress1] Is Not Null
    

    您可以将查询括在括号中以创建一个派生表,您可以使用查询设计窗口对其进行排序。

    SELECT FirstName, LastName, etc 
    FROM ( <union query> ) As q
    Order by q.[companyname]
    

    【讨论】:

    • 非常感谢您的回复和时间。 Access 只是给了我以下“联合查询中的语法错误”的“有用”错误。由于我一般不熟悉工会,我什至不知道从哪里开始。你认为你能给我什么帮助吗?
    • 我错过了两个别名和一个额外的括号。立即尝试。
    • 它现在运行,但 CompanyName 仍在输入“Home”一词,而不是留空。如果 CompanyName 等于“Home”,有没有办法将 CompanyName 留空?
    • 是的,但我不知道工会 Home 属于哪一半。
    • 如果公司名称为空,您需要 c.[addressline] 吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多