Какой метод запроса я могу использовать для получения данных из 2 основных и 1 основной таблицы сведений в SQL? - PullRequest
0 голосов
/ 02 мая 2020

У меня есть 3 таблицы People, Distribution, DistributionPeopleDetails следующим образом:

enter image description here

Я хочу получить информацию, когда люди получили последнюю помощь и когда они должны чтобы получить следующую помощь.

Я пытался объединить три таблицы по-разному, но ничего не дало мне ожидаемого результата, я не слишком опытен с SQL, так что, вероятно, я просто думаю о базовых c присоединяется, в то время как может понадобиться какой-то продвинутый трюк, подобный группе et et 1025 *. Кто-нибудь может мне помочь, пожалуйста?

Я уже пробовал это сделать:

select top 1 P.Name, d.DistributionDate as 'Next Scheduled Help'

from Peoples p left join [dbo].[DistributionPeopleDetails] dp on p.Id = 
dp.PeopleId
left join [dbo].[Distributions] d on dp.DistributionId = d.Id
where d.DistributionDate > GetDate() order by d.Id



select top 1 P.Name, d.DistributionDate as 'LastScheduled Help'

from Peoples p left join [dbo].[DistributionPeopleDetails] dp on p.Id = 
dp.PeopleId
left join [dbo].[Distributions] d on dp.DistributionId = d.Id
where d.DistributionDate < GetDate() order by d.Id

Я получаю ожидаемый результат, но не могу вставить этот фрагмент запроса в свой SP, где я Я читаю все свойства для людей, присоединившись к нескольким другим таблицам.

Что я получил / хочу получить:

enter image description here

1 Ответ

0 голосов
/ 02 мая 2020

Вы ищете объединения и условное агрегирование, например, так?

select
    p.peopleId,
    p.name,
    max(case when d.distributionDate < getdate() then distributionDate end) lastDistibutionDate,
    min(case when d.distributionDate > getdate() then distributionDate end) nextDistibutionDate
from people p
left join distributionPeople dp on dp.peopleId = p.peopleId
left join distribution d on d.distributionId = dp.distributionId
group by p.peopleId, p.name

Это дает вам одну запись на строку в people, где столбец lastDistibutionDate содержит самое последнее прошлое distributionDate и столбец nextDistibutionDate ближайший следующий distributionDate.

...