Ms access 访问查询:Where IIF函数

Ms access 访问查询:Where IIF函数,ms-access,where,iif,Ms Access,Where,Iif,我有这个疑问 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.

我有这个疑问

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 | 
但现在我需要按“发票付款”日期过滤。

如果我执行此命令:

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
显示窗口:“引入参数发票\已付款”


如何根据iif函数返回的结果筛选结果?

您必须在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]

或者创建一个查询,然后基于此查询创建另一个查询以获取正确的数据。或子查询

您必须在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]

或者创建一个查询,然后基于此查询创建另一个查询以获取正确的数据。或子查询

您必须在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]

或者创建一个查询,然后基于此查询创建另一个查询以获取正确的数据。或子查询

您必须在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]

或者创建一个查询,然后基于此查询创建另一个查询以获取正确的数据。或子查询

我认为您不希望这里有一个
WHERE
,而是一个
具有
,因为您希望在聚合后对值进行过滤

尝试使用:

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

我认为您不希望这里有一个
WHERE
,而是一个
具有
,因为您希望在聚合后对值进行过滤

尝试使用:

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

我认为您不希望这里有一个
WHERE
,而是一个
具有
,因为您希望在聚合后对值进行过滤

尝试使用:

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

我认为您不希望这里有一个
WHERE
,而是一个
具有
,因为您希望在聚合后对值进行过滤

尝试使用:

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

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

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

WHERE payments.type= 'Invoice' AND payments.datePay=#01/01/2014#
您也不能在where子句中使用MAX(payments.datepay)这样的聚合,它必须位于用户iDevlop所指出的分组子句之后的HAVING子句中

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


现在,问题来了。你只想要一个日期,还是你真的想得到任何发票的最大(datePay)值大于或等于2014年1月1日的日期?如果是这样,请将平等测试改为>=#01/01/2014#

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

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

WHERE payments.type= 'Invoice' AND payments.datePay=#01/01/2014#
您也不能在where子句中使用MAX(payments.datepay)这样的聚合,它必须位于用户iDevlop所指出的分组子句之后的HAVING子句中

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


现在,问题来了。你只想要一个日期,还是你真的想得到任何发票的最大(datePay)值大于或等于2014年1月1日的日期?如果是这样,请将平等测试改为>=#01/01/2014#

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

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

WHERE payments.type= 'Invoice' AND payments.datePay=#01/01/2014#
您也不能在where子句中使用MAX(payments.datepay)这样的聚合,它必须位于用户iDevlop所指出的分组子句之后的HAVING子句中

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


现在,问题来了。你只想要一个日期,还是你真的想得到任何发票的最大(datePay)值大于或等于2014年1月1日的日期?如果是这样,请将平等测试改为>=#01/01/2014#

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

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

WHERE payments.type= 'Invoice' AND payments.datePay=#01/01/2014#
您也不能在where子句中使用MAX(payments.datepay)这样的聚合,它必须位于用户iDevlop所指出的分组子句之后的HAVING子句中

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

现在,问题来了。你只知道吗