Переключение на Главную Страницу Страницы: [1] 2  ОтправитьПечать
Горячая тема (более 10 ответов) Не знаю как правильно сформулировать вопрос (число прочтений - 4140 )
BuZZZard
Full Member
***
Отсутствует



Сообщений: 112
Местоположение: Калининград
Зарегистрирован: 15. Октября 2007
Пол: Мужской
Не знаю как правильно сформулировать вопрос
30. Апреля 2009 :: 09:32
Печать  
Не знаю как правильно сформулировать вопрос, соответственно и поиск не может меня понять.

Есть запрос из документов. Как сделать чтобы в результаты попадали все элементы из справочника Контрагенты, а не только те, которые встречаются в документах?
  
Наверх
ICQ  
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Не знаю как правильно сформулировать вопрос
Ответ #1 - 30. Апреля 2009 :: 09:37
Печать  
напиши сначала здесь свой запрос по документам.
а потом тебе уже и подскажут.
скорее всего надо использовать rigth join к получившемуся запросу
  
Наверх
 
IP записан
 
Nice
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 26
Зарегистрирован: 09. Июля 2007
Re: Не знаю как правильно сформулировать вопрос
Ответ #2 - 30. Апреля 2009 :: 10:16
Печать  
    FROM $Справочник.Контрагенты  AS Клиент (NOLOCK)
LEFT JOIN $Документ.Твоидокументы1 AS Док1 (NOLOCK) ON $Док1.Контрагент= Клиент.Id
LEFT JOIN $Документ.Твоидокументы2 AS Док2 (NOLOCK) ON $Док2.Контрагент= Клиент.Id
Можно так, если поле  Контрагенты общий реквизиту с установленным свойством "отбор" то можно LEFT JOIN _1sJourn
  
Наверх
 
IP записан
 
BuZZZard
Full Member
***
Отсутствует



Сообщений: 112
Местоположение: Калининград
Зарегистрирован: 15. Октября 2007
Пол: Мужской
Re: Не знаю как правильно сформулировать вопрос
Ответ #3 - 30. Апреля 2009 :: 11:02
Печать  
Код
Выбрать все
SELECT
	$Док.Контрагент as [Контрагент $Справочник.Контрагенты],
	$Док.АдресДоставки as [АдресДоставки $Справочник.АдресаДоставки],
	Жур.IDDoc as [Документы $Документ.ЗаявкаКлиента],
	SUM($ДокС.Количество) as Количество,
	1 as КоличествоДокументов
FROM
   $ДокументСтроки.ЗаявкаКлиента as ДокС
INNER JOIN
	$Документ.ЗаявкаКлиента as Док ON Док.IDDoc = ДокС.IDDoc
INNER JOIN
	1SJourn as Жур ON Жур.IDDoc = ДокС.IDDoc
WHERE
	Жур.Date
		BETWEEN :НачДата~~ AND :КонДата~~ AND
	Жур.Closed = 1 AND
	$ДокС.ТМЦ = :Вода
GROUP BY
	$Док.Контрагент,
	$Док.АдресДоставки,
	Жур.IDDoc
 



А можно ли использовать RIGHT OUTER JOIN?
Я могу ошибаться, но мне кажется в таком случае будет проще модифицировать запрос. А в условиях практически полного незнания SQL это критично Подмигивание
  
Наверх
ICQ  
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Не знаю как правильно сформулировать вопрос
Ответ #4 - 30. Апреля 2009 :: 11:31
Печать  
приведенный выше запрос ( без учета всех клиентов ) работает правильно ?
rigth join всегда можно привести к left join ( поменяв местами таблицы)
Чаще используют left join  наверное потому что мы читаем слева направо , а что означает left join
лучше в книжках почитать.
  
Наверх
 
IP записан
 
BuZZZard
Full Member
***
Отсутствует



Сообщений: 112
Местоположение: Калининград
Зарегистрирован: 15. Октября 2007
Пол: Мужской
Re: Не знаю как правильно сформулировать вопрос
Ответ #5 - 30. Апреля 2009 :: 11:32
Печать  
Код
Выбрать все
SELECT
	$Док.Контрагент as [Контрагент $Справочник.Контрагенты],
	$Док.АдресДоставки as [АдресДоставки $Справочник.АдресаДоставки],
	Жур.IDDoc as [Документы $Документ.ЗаявкаКлиента],
	SUM($ДокС.Количество) as Количество,
	1 as КоличествоДокументов
FROM
   $ДокументСтроки.ЗаявкаКлиента as ДокС
INNER JOIN
	$Документ.ЗаявкаКлиента as Док ON Док.IDDoc = ДокС.IDDoc
INNER JOIN
	1SJourn as Жур ON Жур.IDDoc = ДокС.IDDoc
RIGHT OUTER JOIN
	$Справочник.Контрагенты AS СпрКонтрагенты ON $Док.Контрагент = СпрКонтрагенты.id
WHERE
	Жур.Date
		BETWEEN :НачДата~~ AND :КонДата~~ AND
	Жур.Closed = 1 AND
	$ДокС.ТМЦ = :Вода
GROUP BY
	$Док.Контрагент,
	$Док.АдресДоставки,
	Жур.IDDoc
 



Сделал с правым. Ничего не изменилось. Неужели в данном случае только левое поможет?
  
Наверх
ICQ  
IP записан
 
BuZZZard
Full Member
***
Отсутствует



Сообщений: 112
Местоположение: Калининград
Зарегистрирован: 15. Октября 2007
Пол: Мужской
Re: Не знаю как правильно сформулировать вопрос
Ответ #6 - 30. Апреля 2009 :: 11:33
Печать  
Z1 писал(а) 30. Апреля 2009 :: 11:31:
приведенный выше запрос ( без учета всех клиентов ) работает правильно ?


Да. Правильно.
  
Наверх
ICQ  
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Не знаю как правильно сформулировать вопрос
Ответ #7 - 30. Апреля 2009 :: 11:40
Печать  
Код
Выбрать все
SELECT
	$Справочник.Контрагенты as [Контрагент $Справочник.Контрагенты],
	$Док.АдресДоставки as [АдресДоставки $Справочник.АдресаДоставки],
	Жур.IDDoc as [Документы $Документ.ЗаявкаКлиента],
	SUM($ДокС.Количество) as Количество,
	1 as КоличествоДокументов
FROM
   $ДокументСтроки.ЗаявкаКлиента as ДокС
INNER JOIN
	$Документ.ЗаявкаКлиента as Док ON Док.IDDoc = ДокС.IDDoc
INNER JOIN
	1SJourn as Жур ON Жур.IDDoc = ДокС.IDDoc
RIGHT OUTER JOIN
	$Справочник.Контрагенты AS СпрКонтрагенты ON $Док.Контрагент = СпрКонтрагенты.id
WHERE
	Жур.Date
		BETWEEN :НачДата~~ AND :КонДата~~ AND
	Жур.Closed = 1 AND
	$ДокС.ТМЦ = :Вода
GROUP BY
	$Справочник.Контрагенты,
	$Док.АдресДоставки,
	Жур.IDDoc
 

  
Наверх
 
IP записан
 
ol
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 272
Местоположение: Санкт-Петербург
Зарегистрирован: 24. Января 2009
Пол: Мужской
Re: Не знаю как правильно сформулировать вопрос
Ответ #8 - 30. Апреля 2009 :: 11:48
Печать  
я извиняюсь, может быть немного не в тему, но интересно понять, чем отличается

RIGHT OUTER JOIN
от просто
RIGHT JOIN
? в той документации, что я нашел, об этом ни слова  Улыбка
  
Наверх
ICQ  
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3050
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Не знаю как правильно сформулировать вопрос
Ответ #9 - 30. Апреля 2009 :: 12:25
Печать  
как то так
Код
Выбрать все
WHERE
	(Жур.Date
		BETWEEN :НачДата~~ AND :КонДата~~ AND
	Жур.Closed = 1 AND
	$ДокС.ТМЦ = :Вода) or $Док.Контрагент is null

GROUP BY
	$Справочник.Контрагенты,
	$Док.АдресДоставки,
	Жур.IDDoc 

  

1&&2&&3
Наверх
 
IP записан
 
BuZZZard
Full Member
***
Отсутствует



Сообщений: 112
Местоположение: Калининград
Зарегистрирован: 15. Октября 2007
Пол: Мужской
Re: Не знаю как правильно сформулировать вопрос
Ответ #10 - 30. Апреля 2009 :: 12:47
Печать  
FAILED! ICommandText::Execute(): File 'док.sp30343' does not exist
  
Наверх
ICQ  
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Не знаю как правильно сформулировать вопрос
Ответ #11 - 30. Апреля 2009 :: 12:48
Печать  
Цитата:
Не вижу разницы со своим примером. Печаль
И он выводит такие же результаты как и ранее. т.е. только контров которые в документах.

А в левое вообще не понимаю как переделать. Тыкаюсь как слепой. Ничего не получается.

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



Код
Выбрать все
SELECT
	$Справочник.Контрагенты as [Контрагент $Справочник.Контрагенты],
	$Док.АдресДоставки as [АдресДоставки $Справочник.АдресаДоставки],
	Жур.IDDoc as [Документы $Документ.ЗаявкаКлиента],
	SUM($ДокС.Количество) as Количество
FROM
   $ДокументСтроки.ЗаявкаКлиента as ДокС
INNER JOIN
	$Документ.ЗаявкаКлиента as Док ON Док.IDDoc = ДокС.IDDoc
INNER JOIN
	1SJourn as Жур ON Жур.IDDoc = ДокС.IDDoc
RIGHT OUTER JOIN
	$Справочник.Контрагенты AS СпрКонтрагенты ON $Док.Контрагент = СпрКонтрагенты.id
WHERE
	Жур.Date
		BETWEEN :НачДата~~ AND :КонДата~~ AND
	Жур.Closed = 1 AND
	$ДокС.ТМЦ = :Вода
GROUP BY
	$Справочник.Контрагенты,
	$Док.АдресДоставки,
	Жур.IDDoc
 

  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Не знаю как правильно сформулировать вопрос
Ответ #12 - 30. Апреля 2009 :: 12:51
Печать  
И вообще до меня плохо доходит постановка задачи как в subj.

Предположим хороших документов будет 100 а клиентов
как реально в нашей базе  > 50 000.
И зачем мне их всех выводить. Ладно этот пост можно расматривать как отступление
от subj ( постановка задачи не обсуждается ).
  
Наверх
 
IP записан
 
BuZZZard
Full Member
***
Отсутствует



Сообщений: 112
Местоположение: Калининград
Зарегистрирован: 15. Октября 2007
Пол: Мужской
Re: Не знаю как правильно сформулировать вопрос
Ответ #13 - 30. Апреля 2009 :: 12:57
Печать  
Z1 писал(а) 30. Апреля 2009 :: 12:51:
И вообще до меня плохо доходит постановка задачи как в subj.

Предположим хороших документов будет 100 а клиентов
как реально в нашей базе  > 50 000.
И зачем мне их всех выводить. Ладно этот пост можно расматривать как отступление
от subj ( постановка задачи не обсуждается ).


Надо абсолютно по всем клиентам провести анализ. Кто, что, и когда.... Если клиент пропал - он нужен в отчете. Если клиент выбился из своей средней периодичности - он нужен в отчете. Остальные не нужны. Это вкратце.
  
Наверх
ICQ  
IP записан
 
BuZZZard
Full Member
***
Отсутствует



Сообщений: 112
Местоположение: Калининград
Зарегистрирован: 15. Октября 2007
Пол: Мужской
Re: Не знаю как правильно сформулировать вопрос
Ответ #14 - 30. Апреля 2009 :: 13:07
Печать  
Код
Выбрать все
SELECT
	$Справочник.Контрагенты as [Контрагент $Справочник.Контрагенты],
	$Док.АдресДоставки as [АдресДоставки $Справочник.АдресаДоставки],
	Жур.IDDoc as [Документы $Документ.ЗаявкаКлиента],
	SUM($ДокС.Количество) as Количество
FROM
   $ДокументСтроки.ЗаявкаКлиента as ДокС
INNER JOIN
	$Документ.ЗаявкаКлиента as Док ON Док.IDDoc = ДокС.IDDoc
INNER JOIN
	1SJourn as Жур ON Жур.IDDoc = ДокС.IDDoc
RIGHT OUTER JOIN
	$Справочник.Контрагенты AS СпрКонтрагенты ON $Док.Контрагент = СпрКонтрагенты.id
WHERE
	Жур.Date
		BETWEEN :НачДата~~ AND :КонДата~~ AND
	Жур.Closed = 1 AND
	$ДокС.ТМЦ = :Вода
GROUP BY
	$Док.Контрагент,
	$Док.АдресДоставки,
	Жур.IDDoc 



Выдает ошибку:
FAILED! ICommandText::Execute(): SQL: Column 'SC39' is not found.
  
Наверх
ICQ  
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 
ОтправитьПечать