【问题标题】:Calculated field with Sum IFF in MS Access 2010: Query and Expression BuilderMS Access 2010 中使用 Sum IFF 的计算字段:查询和表达式生成器
【发布时间】:2012-12-12 18:07:25
【问题描述】:

在 MS Access 2010 中,我成功编写了一个查询,该查询从两个单独的表中为我提供了以下字段:[客户 ID]、[产品]、[价格]、[总价格] 和 [付款方式] 客户可以订购不同的产品或使用不同的付款方式。现在,我正在尝试创建一个计算字段,该字段将仅给出每位客户在线支付的产品的总数/总和。

在线的[付款方式]代码是“D”。我将代码生成器表达式与以下表达式一起使用:

1) Sum(IIf([Customer ID] = [Customer ID] AND [Payment Method] = "D", [Price], NULL))

但是,它一直给我这个错误消息:您试图执行一个查询,该查询不包含指定表达式“客户 ID”作为聚合函数的一部分。

如果我想在 SQL(或表达式生成器)中执行此操作,我将如何执行?到目前为止,我尝试过的所有操作都会导致出现相同的错误消息。

编辑
我的完整查询是:

SELECT CUSTOMER_INFO.ID AS [Customer ID], 
CUSTOMER_INFO.PROD_KEY AS [Product], 
CUSTOMER_INFO.PROD_PRICE AS [Price], 
CUSTOMER_INFO.SUM_PRICE AS [Total Price], 
PAYMENT_TRANZAK.PAY_METHD, 
Sum(IIf([Customer ID]=[Customer ID] And [PAY_MTHD]="D",[Price],[IsNull])) AS [Online Total]

FROM CUSTOMER_INFO INNER JOIN PAYMENT_TRANZAK ON (CUSTOMER_INFO.PROD_KEY= PAYMENT_TRANZAK.SSBSECT_CRN) AND (CUSTOMER_INFO.TERM_CODE_KEY = PAYMENT_TRANZAK.DATE_CODE)

WHERE (
((CUSTOMER_INFO.SUM_PRICE)>0) AND ((PAYMENT_TRANZAK.PAY_METHD) Is Not Null) AND     ((CUSTOMER_INFO.CUST_CODE)="RE" Or (CUSTOMER_INFO.CUST_CODE)="RW") AND   ((CUSTOMER_INFO.DATE_CODE)=[Please enter a transaction date: ]) AND   ((CUSTOMER_INFO.ESTS_CODE)="EL") AND ((CUSTOMER_INFO.STST_CODE)="AS")
)
ORDER BY CUSTOMER_INFO.ID;

【问题讨论】:

  • 您能发布完整的查询吗?
  • 当然,请看下面:SELECT CUSTOMER_INFO.ID AS [Customer ID], CUSTOMER_INFO.PROD_KEY AS [Product], CUSTOMER_INFO.PROD_PRICE AS [Price], CUSTOMER_INFO.SUM_PRICE AS [Total Price], PAYMENT_TRANZAK .PAY_METHD, Sum(IIf([Customer ID]=[Customer ID] And [PAY_MTHD]="D",[Price],[IsNull])) AS [在线总计] FROM CUSTOMER_INFO INNER JOIN PAYMENT_TRANZAK ON (CUSTOMER_INFO.PROD_KEY= PAYMENT_TRANZAK.SSBSECT_CRN) AND (CUSTOMER_INFO.TERM_CODE_KEY = PAYMENT_TRANZAK.DATE_CODE) WHERE 子句在下一篇文章中...
  • ... WHERE (((CUSTOMER_INFO.SUM_PRICE)>0) AND ((PAYMENT_TRANZAK.PAY_METHD) 不为空) AND ((CUSTOMER_INFO.CUST_CODE)="RE" 或 (CUSTOMER_INFO.CUST_CODE) ="RW") AND ((CUSTOMER_INFO.DATE_CODE)=[请输入交易日期:]) AND ((CUSTOMER_INFO.ESTS_CODE)="EL") AND ((CUSTOMER_INFO.STST_CODE)="AS")) ORDER BY CUSTOMER_INFO .ID;
  • 我将此移至您的问题。 (顺便说一句,你可以用这种东西编辑你的问题)

标签: sql ms-access msbuild ms-access-2007


【解决方案1】:

您正在尝试对非聚合数据执行聚合。为了求和,函数需要一些东西来求和;一组数据。因此,您将需要一个Group By 子句。添加子句GROUP BY CUSTOMER_INFO.ID 将创建每个客户ID 的总数。您也可以将付款类型子句添加到 where 语句中,以获得正确的付款类型逻辑。

SELECT CUSTOMER_INFO.ID AS [Customer ID]

  , Sum([Price]) AS [Online Total] 
FROM CUSTOMER_INFO 
INNER JOIN PAYMENT_TRANZAK 
ON (CUSTOMER_INFO.PROD_KEY= PAYMENT_TRANZAK.SSBSECT_CRN) 
    AND (CUSTOMER_INFO.TERM_CODE_KEY = PAYMENT_TRANZAK.DATE_CODE)
WHERE (((CUSTOMER_INFO.SUM_PRICE)>0) 
    AND ((PAYMENT_TRANZAK.PAY_METHD) Is Not Null) 
    AND ((CUSTOMER_INFO.CUST_CODE)="RE" Or (CUSTOMER_INFO.CUST_CODE)="RW") 
    AND ((CUSTOMER_INFO.DATE_CODE)=[Please enter a transaction date: ]) 
    AND ((CUSTOMER_INFO.ESTS_CODE)="EL") 
    AND ((CUSTOMER_INFO.STST_CODE)="AS"))
    AND PAYMENT_TRANZAK.PAY_METHD="D"
GROUP BY CUSTOMER_INFO.ID
ORDER BY CUSTOMER_INFO.ID; 

因为您没有聚合所有字段,并非所有字段都被分组,所以无法在这种查询中表达它们。这些

  • CUSTOMER_INFO.PROD_KEY AS [产品]
  • CUSTOMER_INFO.PROD_PRICE AS [价格]
  • CUSTOMER_INFO.SUM_PRICE AS [总价]
  • PAYMENT_TRANZAK.PAY_METHD

因此不是很好的匹配。

但是你比我更了解你的数据,也许有一种方法可以在逻辑上适应它们。这取决于你。

编辑: 您可以尝试这样的查询,您不进行任何过滤,但您只需进行分组。这将显示所有内容,然后您对报告或表单进行过滤。

SELECT CUSTOMER_INFO.ID AS [Customer ID]
  , CUSTOMER_INFO.CUST_CODE
  , Sum(CUSTOMER_INFO.PROD_PRICE) AS [Online Total] 
  , Sum(CUSTOMER_INFO.SUM_PRICE) as [SumOfSumPrice]
  , CUSTOMER_INFO.CUST_CODE
  , PAYMENT_TRANZAK.PAY_METHD
  , CUSTOMER_INFO.DATE_CODE
  , CUSTOMER_INFO.ESTS_CODE
  , CUSTOMER_INFO.STST_CODE
FROM CUSTOMER_INFO 
INNER JOIN PAYMENT_TRANZAK 
ON (CUSTOMER_INFO.PROD_KEY= PAYMENT_TRANZAK.SSBSECT_CRN) 
    AND (CUSTOMER_INFO.TERM_CODE_KEY = PAYMENT_TRANZAK.DATE_CODE)
GROUP BY CUSTOMER_INFO.ID
  , CUSTOMER_INFO.CUST_CODE
  , PAYMENT_TRANZAK.PAY_METHD
  , CUSTOMER_INFO.DATE_CODE
  , CUSTOMER_INFO.ESTS_CODE
  , CUSTOMER_INFO.STST_CODE
ORDER BY CUSTOMER_INFO.ID;

【讨论】:

  • 布拉德,无论如何,您知道是否可以通过其他方式做到这一点?谢谢!
【解决方案2】:

在 MS SQL SERVER、ORACLE、MS ACCESS 中,您需要将 select 子句中的所有其他字段添加到聚合子句中。

从 Access Help 中关于该主题的内容开始可能会有所帮助:

Jet SQL 帮助:SELECT 字段列表中的所有字段必须包含在 GROUP BY 子句中或作为 SQL 聚合函数的参数包含在内。来自帮助系统的这句话暗示所有对字段的引用,即使在复合引用必须是聚合的(即包含在上面列出的聚合函数之一中)或包含在 GROUP BY 子句中。任何一种类型的任何表达式都被认为是聚合的。聚合函数只能采用解析为非聚合字段的字段引用表达式(即,多次聚合数据同样无效)。

reference

由于聚合函数无论如何都会聚合您的查询,因此您可以尝试不使用 group by 子句并查看。 或者您可以包括每个字段。问题可能主要出在您的情况下,IIF 中有两个不同的字段,但未处理空值。对于聚合,我将使用零或确保将 Isnull 与 IIF 相加。

PS:我是从手机发来的答案,第一次好像还没有完整的答案。

【讨论】:

  • 非常感谢您的输入,但是您提到的选项,我已经尝试过了,我得到了相同的错误消息。此外,我确实在 group by 子句中包含了参考字段。然而,我仍然收到同样的警告信息。也许,我应该把它包含在我原来的帖子中。非常感谢您的指点!
猜你喜欢
  • 1970-01-01
  • 2017-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多