2011-05-30 61 views
0

試圖爲MSSQL練習創建4路查詢。讓我簡單描述表格:涉及四路加入的SQL查詢

4個主表,供應商(供應商詳細信息,pk vendorId),發票(發票詳細信息pk InvoiceId,fk VendorID),InvoiceLineItems(I)和GlAccounts(accountNo pk)。

查詢:編寫一條SELECT語句,返回四列:VendorName,AccountDescription,LineItemCount和LineItemSum。 LineItemCount是行數,並LineItemSum是InvoiceLineItemAmount列

我的解決方案的總和:

SELECT Vendors.VendorName, GLAccounts.AccountDescription, 
    SUM(InvoiceLineItems.InvoiceLineItemAmount) as LineItemSum, 
    Count (InvoiceLineItems.InvoiceID) as LineItemCount 
FROM Vendors INNER JOIN Invoices 
ON Vendors.VendorID = Invoices.VendorID 
INNER JOIN InvoiceLineItems 
    ON Invoices.InvoiceID = InvoiceLineItems.InvoiceID 
INNER JOIN GLAccounts 
    ON InvoiceLineItems.AccountNo = GLAccounts.AccountNo 
ORDER BY Vendors.VendorName 

問題:

消息8120,級別16,狀態1,行 列'Vendors.VendorName'在選擇列表中無效,因爲它不包含在聚合函數或GROUP BY子句中。

的窘境:

不知道爲什麼這個問題發生,因爲很清楚我在集團提Vendors.VendorName By子句。我懷疑它與我正在執行的內部連接有關,因爲它們是多個,我必須有錯誤。

任何人都可以發現這裏有什麼問題嗎?

+0

如果你有多個總帳科目的發票多個行項目,什麼應返回:用逗號分隔的列表? – Thomas 2011-05-30 23:41:07

+0

你明確提到它在哪個* GROUP BY條款中? – Phil 2011-05-30 23:42:53

回答

2

添加GROUP BY Vendors.VendorName,GLAccounts.AccountDescription

0

嘗試

SELECT Vendors.VendorName, GLAccounts.AccountDescription, SUM(InvoiceLineItems.InvoiceLineItemAmount) as LineItemSum, Count (InvoiceLineItems.InvoiceID) as LineItemCount FROM Vendors INNER JOIN Invoices ON Vendors.VendorID = Invoices.VendorID INNER JOIN InvoiceLineItems ON Invoices.InvoiceID = InvoiceLineItems.InvoiceID INNER JOIN GLAccounts ON InvoiceLineItems.AccountNo = GLAccounts.AccountNo Group By Vendors.VendorName, GLAccounts.AccountDescription ORDER BY Vendors.VendorName. 

Sum, Count, Avg etc都是集合函數,所以記錄有一定的標準進行分組,以執行這些操作。

2

由於您彙總(彙總)InvoiceLineItemAmountInvoiceID到一個結果每個VendorName,你還需要爲VendorNameAccountDescription列做同樣的。只需在您的查詢結尾添加一個

GROUP BY Vendors.VendorName, GLAccounts.AccountDescription 

0

我們必須說明您在同一張發票上有多個gl賬戶值的可能性。爲此,我們需要使用一個子查詢,它將給我們一個這些帳號的分隔列表。另外,建議您爲單張發票執行此操作?如果是的話,結果可能是:

Select V.VendorName 
    , Stuff(
     (
     Select ', ' + GA1.AccountDescription 
     From InvoiceLineItems As LI1 
      Join GLAccounts As GA1 
       On GA1.AccountNo = LI1.AccountNo 
     Where LI1.InvoiceId = I.InvoiceId 
     Group By GA1.AccountDescription 
     Order By GA1.AccountDescription 
     ).value('.', 'nvarchar(max)'), 1, 2, '') As AccountDescriptions 
    , Coalesce(LineItemInfo.ItemCount, 0) As LineItemCount 
    , Coalesce(LineItemInfo.AmountTotal, 0) As LineItemSum 
From Vendors As V 
    Join Invoices As I 
     On I.vendorid = V.vendorid 
    Left Join (
       Select LI2.InvoiceId 
        , Count(*) As ItemCount 
        , Sum(LI2.Amount) As AmountTotal 
       From InvoiceLineItems As LI2 
       Group By LI2.InvoiceId 
       ) As LineItemInfo 
     On LineItemInfo.InvoiceId = I.InvoiceId 
Where I.InvoiceId = @SomeInvoiceId