SQL-запрос, включающий четырехстороннее соединение - PullRequest
0 голосов
/ 31 мая 2011

Попытка создать 4-сторонний запрос для упражнения MSSQL. Позвольте мне кратко описать таблицы:

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, строка 1 Столбец Vendors.VendorName недопустим в списке выбора, поскольку он не содержится ни в статистической функции, ни в предложении GROUP BY.

ДИЛЕММА:

Не уверен, почему эта проблема происходит, потому что я очень четко упоминаю Vendors.VendorName в предложении Group By. Я подозреваю, что это как-то связано с внутренними соединениями, которые я выполняю, поскольку их много, у меня должно быть что-то не так.

Может кто-нибудь определить, что здесь не так?

Ответы [ 4 ]

2 голосов
/ 31 мая 2011

Поскольку вы суммируете (агрегируете) InvoiceLineItemAmount и InvoiceID до одного результата для каждого VendorName, вам также необходимо сделать то же самое для столбцов VendorName и AccountDescription.Просто добавьте

GROUP BY Vendors.VendorName, GLAccounts.AccountDescription

в конце вашего запроса.

2 голосов
/ 31 мая 2011

Добавление GROUP BY Vendors.VendorName, GLAccounts.AccountDescription

0 голосов
/ 31 мая 2011

Мы должны учитывать возможность того, что у вас есть несколько значений учетной записи 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
0 голосов
/ 31 мая 2011

Try

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 являются агрегатными функциями, поэтому для выполнения этих операций записи должны быть сгруппированы по определенным критериям.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...