在MS Access 2010中,我成功编写了一个查询,从两个单独的表中提供以下字段:[客户ID],[产品],[价格],[总价格]和[付款方式] 客户可以订购不同的产品或使用不同的付款方式。现在,我想要一个计算字段,只给出每个客户在线支付的产品总数/总和。
在线的[付款方式]代码是“D”。我使用代码生成器表达式和以下表达式:
1)总和(IIf([客户ID] = [客户ID]和[付款方式] =“D”,[价格],NULL))
但是,它继续给我这个错误消息:您尝试执行的查询不包含指定表达式“Customer 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;
答案 0 :(得分: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;
由于您没有聚合所有字段,并非所有字段都按其分组,因此无法在此类查询中表达它们。这些
但是你比我更了解你的数据,也许有一种方法可以在逻辑上适应它们。这取决于你。
编辑: 您可以尝试这样的查询,在这里您不进行任何过滤,但您可以进行分组。这将显示您在报告或表单上进行过滤的所有内容。
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;
答案 1 :(得分:0)
在MS SQL SERVER,ORACLE,MS ACCESS中,您需要将select子句中的所有其他字段添加到聚合子句中。
可能有助于开始使用Access帮助对该主题的说法:
Jet SQL帮助:SELECT字段列表中的所有字段必须包含在GROUP BY子句中,或者作为参数包含在SQL聚合函数中。来自帮助系统的这句话暗示所有对字段的引用,即使在复合字段内引用,必须聚合(IE。包含在上面列出的一个聚合函数中)或包含在GROUP BY子句中。任何类型的任何表达式都被视为聚合。聚合函数只能采用解析为非聚合字段的字段引用表达式(IE。多次聚合数据同样无效)。
由于聚合函数无论如何聚合您的查询,您可以在没有group by子句的情况下尝试它并查看。
或者您可以包括每个字段。问题可能主要出在您的情况下,IIF
中有两个不同的字段但尚未处理空值。对于聚合,我会使用零或确保Isnull
总和IIF。
PS:我从手机发送了答案,似乎第一次没有公布完整的答案。