【问题标题】:Access query: Where IIF function访问查询:哪里有IIF函数
【发布时间】:2014-12-16 12:02:12
【问题描述】:

我有这个问题

SELECT 
    invoice.number,
    invoice.amount,
    invoice.paid, 
    iif (invoice.paid='Y', Max(payments.datePay), '') as invoice_paid
FROM 
    payments 
    INNER JOIN 
    invoice
    ON (invoices.number = payments.numberDoc AND payments.type = 'Invoice')
WHERE 
    payments.type= 'Invoice'
GROUP BY
    number, 
    amount,
    paid

运行良好。

示例结果:

number   |  amount  | paid | invoice_paid

00000003 |  347,94€ |   Y |    23/05/2014

00000004 |  462,65€ |   N | 

00000005 |  462,65€ |   Y | 13/08/2014

00000006 |  453,88€ |   Y | 03/09/2014

00000007 |  155,57€ |   Y | 04/09/2014

00000008 |  500,00€ |   N | 

但现在我需要按“invoice_paid”日期过滤。

如果我执行这个:

SELECT 
    invoice.number,
    invoice.amount,
    invoice.paid, 
    iif (invoice.paid='Y', Max(payments.datePay), '') as invoice_paid
FROM 
    payments 
    INNER JOIN 
    invoice
    ON (invoices.number = payments.numberDoc AND payments.type = 'Invoice')
WHERE 
    payments.type= 'Invoice' AND invoice_paid=#01/01/2014#
GROUP BY
    number, 
    amount,
    paid

显示窗口:“引入参数 invoice_paid”。

如何根据 iif 函数返回的结果过滤结果?

【问题讨论】:

    标签: ms-access where iif


    【解决方案1】:

    其他答案都是准确的,但让我试着为你澄清一些事情,然后问一个问题......

    您为“invoice_paid”计算的列不能通过它的别名结果列在 where 子句中使用,您必须使用表本身的原始原始日期,例如

    WHERE payments.type= 'Invoice' AND payments.datePay=#01/01/2014#
    

    您也不能在 where 子句中使用诸如 MAX(payments.datepay) 之类的聚合,如用户 iDevlop 所述,它必须位于 GROUPING 子句之后的 HAVING 子句中。

    您有一个特定日期的过滤器(基于 = ),但您的数据都没有显示这样的日期。因此,这不仅可能不会通过 WHERE 或 HAVING 方法返回结果(或很少)。如果您正在寻找特定日期的付款,我会直接查询并显示。

    现在,问题。您是否只想要一个日期,或者您是否真的想要获得最大(datePay)大于或等于 2014 年 1 月 1 日的发票?如果是这样,请将相等测试更改为 >= #01/01/2014#

    【讨论】:

    • 我认为这个“WHERE payment.type= 'Invoice' AND payment.datePay=#01/01/2014#”不会返回我需要的数据。我不想按 payment.datePaid 过滤,而是 iif 函数的结果,这是不同的。每张发票可以有多个付款。而且我只对每张发票的最后付款感兴趣。是支付发票时“invoice_paid”列中显示的日期。
    • 忘记我的最后评论。你的答案是正确的 :-) 工作正常。
    • @kontable,那么你想要 HAVING 子句,但不确定日期范围 vs = vs >= 条件
    【解决方案2】:

    你必须在 WHERE 条件中使用整个表达式,简单地使用别名是行不通的,但会导致输入参数值框。所以要么,

    SELECT 
        invoice.[number],
        invoice.[amount],
        invoice.[paid], 
        IIF (invoice.paid='Y', Max(payments.datePay), '') as invoice_paid
    FROM 
        payments 
        INNER JOIN 
        invoice
        ON (invoices.number = payments.numberDoc AND payments.type = 'Invoice')
    WHERE 
        payments.type= 'Invoice' 
        AND 
        IIF (invoice.paid='Y', Max(payments.datePay), '') = #01/01/2014#
    GROUP BY
        [number], 
        [amount],
        [paid]
    

    或者创建一个 Query,并基于这个 Query 创建另一个 Query 以获得正确的数据。或子查询。

    【讨论】:

    • 我试过但返回错误:WHERE 子句中不能有聚合函数
    【解决方案3】:

    我认为您在这里不需要WHERE,而是HAVING,因为您想在聚合后过滤值。

    尝试使用:

    where payments.type='Invoice'
    GROUB BY ...
    HAVING iif(invoice.paid='Y',max(payments.datePay),'') = #01/01/2014#
    

    【讨论】:

    • 返回错误:不包含指定表达式作为聚合函数
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-24
    • 1970-01-01
    • 2020-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多