2016-10-19 2 views
2

Я работаю над отчетами о старом для аккаунтов в течение 30 дней, и я присоединяюсь к таблице «Комментарий», потому что AP хочет увидеть последний комментарий, если он существует для клиента.SQL - возвращает только последнюю строку

Таблица комментариев может содержать несколько строк для одного и того же клиента для каждого комментария, прикрепленного к этому клиенту, причем первая запись является самым старым комментарием.

Когда я присоединяюсь к столам, все работает, но возвращает первый комментарий не последним.

Как я могу найти его для поиска нескольких строк для одного и того же клиента, а затем вернуть последний комментарий?

* Примечание - комментарий таблица не имеет даты только поле начинается с 1000 и увеличивается для каждого нового комментария строки

Это то, что я есть сейчас:

SELECT   
    dbo.[Pioneer-CO$Purchase Header].No_, 
    dbo.[Pioneer-CO$Purchase Line].[Amt_ Rcd_ Not Invoiced], 
    dbo.[Pioneer-CO$Purch_ Rcpt_ Header].[Posting Date], 
    dbo.[Pioneer-CO$Comment Line].[Comment], 
    dbo.[Pioneer-CO$Purchase Header].[Sell-to Customer No_] 
FROM 
    dbo.[Pioneer-CO$Purchase Header] 
INNER JOIN 
    dbo.[Pioneer-CO$Purchase Line] ON dbo.[Pioneer-CO$Purchase Header].No_ = dbo.[Pioneer-CO$Purchase Line].[Document No_] 
INNER JOIN 
    dbo.[Pioneer-CO$Purch_ Rcpt_ Header] ON dbo.[Pioneer-CO$Purchase Header].No_ = dbo.[Pioneer-CO$Purch_ Rcpt_ Header].[Order No_] 
INNER JOIN 
    dbo.[Pioneer-CO$Comment Line] ON dbo.[Pioneer-CO$Purchase Header].[Sell-to Customer No_] = dbo.[Pioneer-CO$Comment Line].[No_] 
WHERE 
    (dbo.[Pioneer-CO$Purch_ Rcpt_ Header].[Posting Date] < DATEADD(day, - 30, GETDATE())) 
GROUP BY 
    dbo.[Pioneer-CO$Purchase Header].No_, 
    dbo.[Pioneer-CO$Purchase Line].[Amt_ Rcd_ Not Invoiced], 
    dbo.[Pioneer-CO$Purch_ Rcpt_ Header].[Posting Date], 
    dbo.[Pioneer-CO$Comment Line].[Comment], 
    dbo.[Pioneer-CO$Purchase Header].[Sell-to Customer No_] 
HAVING   
    (dbo.[Pioneer-CO$Purchase Line].[Amt_ Rcd_ Not Invoiced] > '0') 
ORDER BY 
    dbo.[Pioneer-CO$Purch_ Rcpt_ Header].[Posting Date] DESC 
+0

Как и ваша описанная проблема, имейте в виду, что, поскольку вы используете только INNER JOINs, если у клиента нет комментариев вообще, они не будут отображаться в отчете, независимо от того, сколько лет их долг. –

+0

'[дата публикации] desc' вернет первый/последний, так как нисходящий означает« новейший первый ». попробуйте 'asc' вместо этого - самый старый первый –

ответ

0

Вы должны смотреть при ID или первичном ключе, я бы предположил, что более новые комментарии имеют более высокий идентификатор. Вы можете присоединиться к таблицам и сделать Max (ID) или искать последнюю метку времени, если вы используете ее на своем столе.

+0

Я довольно новичок в SQL, и у меня возникли проблемы с использованием функции MAX. Любые предложения о том, как выглядит этот код? – Rkindred

+0

@Rkindred lookup [MAX - MSDN] (https://msdn.microsoft.com/en-us/library/ms187751.aspx). Microsoft MSDN - отличный ресурс по синтаксису и официальному использованию ключевых слов SQL. Кроме того, поймите, что, если функция сама по себе, вы ДОЛЖНЫ иметь столбец (неагрегат), который появляется в 'SELECT', также отображаться в предложении GROUP BY. Обзор с ссылками на другие агрегаты см. В разделе [ФУНКЦИИ АГРЕГАТА - MSDN] (https://MSDN.Microsoft.com/en-us/library/ms173454.aspx) –

1

Я хотел бы использовать что-то вроде этого

select customer.*, lastComment.* 
from account 
cross apply (select top 1 * from comment where 
    comment.customerId=customer.customerId order by commentnumber desc) lastComment 
where customer.age>30 

Если вам необходимо включить клиент без комментариев использовать outer apply вместо cross apply

0

Похоже, у вас есть клиенты для комментариев отношений 1 ко много (0). Как насчет попробовать что-то вроде этого,

SELECT TOP 1 Customers.*, Comments.* 
FROM Customers 
JOIN Customers ON Customers.Id = Comments.Id 
ORDER BY Comments.Id DESC 

Вслед Добавлено после комментариев BIB в

Вы также можете попробовать следующие

SELECT Customers.*, Comments.* 
FROM Comments 
JOIN 
(SELECT MAX(Id) As CId FROM Comments GROUP BY CustomerId) AS CommentsMAX 
ON CommentsMAX.CId = Comments.ID 
JOIN 
Customers ON Customers.Id = Comments.Id 
+0

Это приведет только к возврату одной строки. Будет последним комментарием и клиентом, что этот комментарий связан с – bib1257

1

Я хотел бы использовать следующий запрос:

OUTER APPLY 
(select top 1 [Comment] from dbo.[Pioneer-CO$Comment Line] where dbo.[Pioneer-CO$Purchase Header].[Sell-to Customer No_] = dbo.[Pioneer-CO$Comment Line].[No_] order by [Posting Date] desc) Comments 

Кроме того, используйте Comments.[Comment] в инструкции SELECT вместо dbo.[Pioneer-CO$Comment Line].[Comment]

Столбец dbo. [Pioneer-CO $ Comment Line] должен быть соединен с OUTER APPLY в запросе. Также, закажите по дате публикации комментариев или инкрементному ID.

Смежные вопросы