簡體   English   中英

MS Access 2010中具有總計IFF的計算字段:查詢和表達式生成器

[英]Calculated field with Sum IFF in MS Access 2010: Query and Expression Builder

在MS Access 2010中,我成功編寫了一個查詢,該查詢為我提供了來自兩個單獨表的以下字段:[客戶ID],[產品],[價格],[總價]和[付款方式]客戶可以訂購其他產品或使用其他付款方式。 現在,我正在嘗試一個計算字段,該字段將僅提供每個客戶在線支付的產品的總和。

在線的[付款方式]代碼為“ D”。 我將代碼生成器表達式與以下表達式一起使用:

1)Sum(IIf([客戶ID] = [客戶ID] AND [付款方式] =“ D”,[價格],空)

但是,它一直在給我這個錯誤消息:您試圖執行一個查詢,該查詢不作為聚合函數的一部分包含指定表達式“客戶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;

您正在嘗試對未聚合的數據執行聚合。 為了進行求和,函數需要求和。 一組“數據”。 因此,您將需要在其中使用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;

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

從Access Help在該主題上要說的內容開始可能會有所幫助:

Jet SQL幫助:SELECT字段列表中的所有字段都必須包含在GROUP BY子句中或作為SQL聚合函數的參數包含。幫助系統中的引號表示必須對字段的所有引用(即使在復合引用中)可以匯總(即,在上面列出的匯總函數之一中包含)或包含在GROUP BY子句中。 任何一種類型的表達式都被認為是聚合的。 聚合函數只能采用解析為非聚合字段的字段引用表達式(IE。多次聚合數據同樣無效)。

參考

由於聚合功能始終會聚合您的查詢,因此您可以在不使用group by子句的情況下進行嘗試並查看。 或者,您可以包括每個字段。 問題可能主要在您的情況下,您在IIF有兩個不同的字段,但沒有處理空值。 對於聚合,我將使用零或確保具有Isnull來對IIF求和。

PS:我從手機發送了答案,似乎完整的答案尚未在第一時間發布。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM