Вход | Регистрация
 

Прямой запрос к регистру с соединением со справочником

Прямой запрос к регистру с соединением со справочником
Я
   zenon46
 
04.02.21 - 16:39
Доброго дня! Не получается запрос к регистру с соединением со справочником.
Суть задачи, получить из регистра продажи самую крайнюю продажу по каждому контрагенту из таблицы #TempTable
Вложенный запрос с этой задачей справляется а вот наружний нет, получаю ошибку.."Недопустимое имя столбца "Контрагент".", относится к строке "ON СпрКонтрагенты.ID = ДПослПрод.Контрагент" Что не так ?

Текст запроса такой :
|SELECT
|ДПослПрод.IDDoc as [Док $Документ],
|ДПослПрод.Контрагент AS [Контрагент $Справочник.Контрагенты]
|FROM    
|(
|SELECT TOP 1
|Рег.IDDoc as [Док $Документ],
|Рег.IDDocDef as Док_вид,
|$Рег.Покупатель AS [Контрагент $Справочник.Контрагенты],
|CAST(LEFT(Рег.Date_Time_IDDoc, 8) as DateTime) AS ДатаПослПродажи
|FROM
|$Регистр.Продажи as Рег
|WHERE
|$Рег.Фирма = :ВбрФирма
|ORDER BY
|Рег.Date_Time_IDDOC DESC
|) ДПослПрод
|LEFT JOIN
|$Справочник.Контрагенты AS СпрКонтрагенты With (NOLOCK) ON СпрКонтрагенты.ID = ДПослПрод.Контрагент
|WHERE
|СпрКонтрагенты.ID IN (SELECT Val FROM #TempTable)
   vicof
 
1 - 04.02.21 - 16:51
Недопустимое имя столбца Контрагент".
Плюс соединение будет как бы внутренним, а не левым.
   Курцвейл
 
2 - 04.02.21 - 17:07
А зачем делаете приведение типов в подзапросе?

попробуйте так:

|SELECT
|ДПослПрод.IDDoc as [Док $Документ],
|ДПослПрод.Покупатель AS [Контрагент $Справочник.Контрагенты]
|FROM    
|(
|SELECT TOP 1
|Рег.IDDoc as [Док $Документ],
|Рег.IDDocDef as Док_вид,
|$Рег.Покупатель AS Покупатель,
|CAST(LEFT(Рег.Date_Time_IDDoc, 8) as DateTime) AS ДатаПослПродажи
|FROM
|$Регистр.Продажи as Рег
|WHERE
|$Рег.Фирма = :ВбрФирма
|ORDER BY
|Рег.Date_Time_IDDOC DESC
|) ДПослПрод
|LEFT JOIN
|$Справочник.Контрагенты AS СпрКонтрагенты With (NOLOCK) ON СпрКонтрагенты.ID = ДПослПрод.Покупатель
|WHERE
|СпрКонтрагенты.ID IN (SELECT Val FROM #TempTable)
   zenon46
 
3 - 04.02.21 - 18:14
Вот так запрос запускается но результат пустой :
SELECT
ДПослПрод.Покупатель AS [Контрагент $Справочник.Контрагенты]
FROM    
(
SELECT TOP 1
Рег.IDDoc as [Док $Документ],
Рег.IDDocDef as Док_вид,
$Рег.Покупатель AS Покупатель,
CAST(LEFT(Рег.Date_Time_IDDoc, 8) as DateTime) AS ДатаПослПродажи
FROM
$Регистр.Продажи as Рег
WHERE
$Рег.Фирма = :ВбрФирма
ORDER BY
Рег.Date_Time_IDDOC DESC
) ДПослПрод
LEFT JOIN
$Справочник.Контрагенты AS СпрКонтрагенты With (NOLOCK) ON СпрКонтрагенты.ID = ДПослПрод.Покупатель
WHERE
СпрКонтрагенты.ID IN (SELECT Val FROM #TempTable)
   zenon46
 
4 - 04.02.21 - 18:23
Переделал вот так , вроде работает, проверяю :

SELECT
 Спр.Code AS Код, 
 Спр.ID AS [Контрагент $Справочник.Контрагенты], 
 subsel.ДатаПослПродажи 
FROM #TempTable
temp left join
(
SELECT
 $Рег.Покупатель AS [Контрагент],
 CAST(LEFT(MAX(Рег.Date_Time_IDDOC),8) AS datetime) AS ДатаПослПродажи
FROM
 $Регистр.Продажи as Рег
LEFT JOIN
 $Справочник.Контрагенты AS Спр ON Спр.ID = $Рег.Покупатель
WHERE
 $Рег.Фирма = :ВбрФирма 
GROUP BY 
$Рег.Покупатель
) subsel on temp.val = subsel.Контрагент
LEFT JOIN
$Справочник.Контрагенты AS Спр ON Спр.ID = temp.val
   Ёпрст
 
5 - 04.02.21 - 19:28
(4) мот того, хотя бы так ?

SELECT
 temp.val AS [Контрагент $Справочник.Контрагенты], 
 subsel.ДатаПослПродажи 
FROM #TempTable temp 

left join
(
SELECT
 $Рег.Покупатель as Покупатель,
 CAST(LEFT(MAX(Рег.Date_Time_IDDOC),8) AS datetime) AS ДатаПослПродажи
FROM
 $Регистр.Продажи as Рег
WHERE
$Рег.Фирма = :ВбрФирма and $Рег.Покупатель in (select val from #TempTable)
GROUP BY
$Рег.Покупатель
) subsel on temp.val = subsel.Контрагент
   Ёпрст
 
6 - 04.02.21 - 19:29
+5
-- subsel on temp.val = subsel.Контрагент
subsel on temp.val = subsel.Покупатель

Список тем форума
Рекламное место пустует  Рекламное место пустует
Компьютеры — прекрасное средство для решения проблем, которых до их появления не было.
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.