2011-05-30 58 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