2012-11-21 34 views
2

我有兩個表項目和發票。該數據庫的MS Access(MDB)在sql(MS-Access)中編寫分組查詢

項目表中有場

  1. 專案編號
  2. 項目名
  3. ProjectStatus

發票表有字段

  1. InvoiceID
  2. 專案編號(外鍵)
  3. InvoiceType(支付和收到)
  4. InvoiceChannel(編碼,設計和諮詢)
  5. INVOICEAMOUNT

項目表與一個一對多的關係以項目ID作爲外鍵的發票表。

我想從查詢發票表這樣

Grouping problem in MS Access

創建一個表我怎樣才能做到這一點使用SQL查詢?
或者我必須使用服務器端編碼(我使用C#與ASP.NET)

回答

2

您發佈的表架構沒有包含總和金額的字段。我將其稱爲Amount

首先,創建一個交叉表查詢,並將其保存在數據庫中(我把它叫做ct):

TRANSFORM Sum(Amount) AS SumOfAmount 
SELECT ProjectID, InvoiceType 
FROM Invoices 
GROUP BY ProjectID, InvoiceType 
PIVOT InvoiceChannel In ("Coding","Designing","Consulting"); 

這會給你的ProjectIDInvoiceType作爲前兩列,其中一個「編碼」,「設計」和「諮詢」各增加一列。

爲了得到總,你需要另一個查詢:

SELECT ct.*, Coding + Designing + Consulting AS Total 
FROM ct; 

請記住,如果沒有記錄特定ProjectID/InvoiceType/InvoiceChannel,查詢將返回NULL該組合,這將導致TotalNULL。如果該查詢將在訪問運行(通過Access.Application說),你可以使用Nz功能,它的工作方式類似於??運營商在C#:

SELECT ct.*, Nz(Coding,0) + Nz(Designing,0) + Nz(Consulting,0) AS Total 
FROM ct; 

如果您是從.mdb.accdb通過ADO.NET訪問數據使用OleDbProvider,你可能將無法使用Nz,你將不得不使用更復雜的東西:

SELECT ct.*, 
    Iif(IsNull(Coding), 0, Coding) + 
    Iif(IsNull(Designing), 0, Designing) + 
    Iif(IsNull(Consulting), 0, Consulting) AS Total 
FROM ct; 
+0

遺憾。我已更新問題。加上我不需要跨標籤查詢。我只關心查詢單個表「發票」。我會嘗試你的方法並讓你知道。謝謝... – naveen

+0

如何在沒有交叉表查詢的情況下以您希望的形式從「發票」表中獲取數據? –

+0

讓我們說我擁有所有我希望發票計數的項目ID。兩個表都在不同的mdbs – naveen