агрегатная функция на отдельной таблице - PullRequest
2 голосов
/ 28 марта 2012

Я пытаюсь выбрать самую последнюю дату из одной таблицы (счета-фактуры) для клиента за другой таблицей.Я ищу не одного клиента, а нескольких.То, что я хочу сделать, выглядит примерно так:

select C.[Last Name], C.[First Name], C.[State], I.[Date]  
From myDb.dbo.Customer C  
left join myDb.dbo.Invoice I on I.CustomerID = C.CustomerID  
where c.state=@State and i.date = max(i.date)

Я знаю, что у меня не может быть Max() там, где я пытался использовать HAVING.Я не могу назначить локальную переменную для customerID и сделать where i.date = (select...).Я пытаюсь сохранить все это как один оператор, поскольку он выполняется на нескольких БД из одной БД.

update:
Я решил изменить свои требования к дизайну, поскольку это не былонаиболее оптимальное решение.

Ответы [ 4 ]

1 голос
/ 28 марта 2012

Производная таблица возвращает дату последнего счета на одного клиента.Затем он соединяется с клиентом.

select C.[Last Name], C.[First Name], C.[State], LastInvoice.LastInvoiceDate
from myDb.dbo.Customer C  
inner join
(
    select I.CustomerID, max (I.Date) LastInvoiceDate
      from myDb.dbo.Invoice I
     group by I.CustomerID
) LastInvoice
  on C.CustomerID = LastInvoice.CustomerID

Может быть дублирование, если у клиента было больше счетов в тот же день (предположительно, даты не содержат компонент времени).Вы могли бы разобраться с отличным.

1 голос
/ 28 марта 2012
;with cte as
(
select C.[Last Name], C.[First Name], C.[State], I.[Date]  
From myDb.dbo.Customer C  
left join myDb.dbo.Invoice I on I.CustomerID = C.CustomerID  
where c.state=@State 
) select * from cte where cte.Date = (select max (cte.Date) from cte)
1 голос
/ 28 марта 2012

Возможно, вы хотите сгруппировать:

select C.[Last Name], C.[First Name], C.[State], max(I.[Date]) as [Date]
from myDb.dbo.Customer C
    left join myDb.dbo.Invoice I on I.CustomerID = C.CustomerID
where C.state = @State
group by C.[Last Name], C.[First Name], C.[State]

Обновлено:

select A.[Last Name], A.[First Name], A.[State], B.[Date]
from myDb.dbo.Customer A
    join (
        -- Get Customers by State with their most recent Invoice Date
        select C.[CustomerID], max(I.[Date]) as [Date]
        from myDb.dbo.Customer C
            left join myDb.dbo.Invoice I on I.[CustomerID] = C.[CustomerID]
        where C.[State] = @State
        group by C.[CustomerID]
    ) B on A.[CustomerID] = B.[CustomerID]
0 голосов
/ 28 марта 2012
select C.[Last Name], C.[First Name], C.[State], I.[Date] ,
(select top 1 date from invoice I where I.CustomerID = C.CustomerID order by date desc)
From myDb.dbo.Customer C  
...