Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Горячая тема (более 10 ответов) Помогите соединить Индексированные таблицы (число прочтений - 4024 )
SashaL
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 41
Зарегистрирован: 15. Октября 2008
Помогите соединить Индексированные таблицы
14. Августа 2013 :: 09:10
Печать  
Добрый день, есть таблицы:
Name      field1      field2      field3
Erik      Группа1      Подгр11      1
Erik      Группа1      Подгр12      1
Erik      Группа3      Подгр32      1
John      Группа2      Подгр21      1
John      Группа2      Подгр22      1
John      Группа2      Подгр31      1
Mark      Группа1      Подгр12      1
Mark      Группа2      Подгр21      1

и

field1      field2
Группа1      Подгр11
Группа1      Подгр12
Группа2      Подгр21
Группа2      Подгр22
Группа3      Подгр31
Группа3      Подгр32

Из них надо получить

Name      field1      field2      field3
Erik      Группа1      Подгр11      1
Erik      Группа1      Подгр12      1
Erik      Группа2      Подгр21      0
Erik      Группа2      Подгр22      0
Erik      Группа3      Подгр31      0
Erik      Группа3      Подгр32      1
John      Группа1      Подгр11      0
John      Группа1      Подгр12      0
John      Группа2      Подгр21      1
John      Группа2      Подгр22      1
John      Группа2      Подгр31      1
John      Группа3      Подгр32      0
Mark      Группа1      Подгр11      0
Mark      Группа1      Подгр12      1
Mark      Группа2      Подгр21      1
Mark      Группа2      Подгр22      0
Mark      Группа3      Подгр31      0
Mark      Группа3      Подгр32      0

Натолкните на верную мысль, пожалуйста.
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Помогите соединить Индексированные таблицы
Ответ #1 - 14. Августа 2013 :: 09:33
Печать  
откуда ИТЗ получены ?
Мот проще в запросе сразу слепить всё ..
  
Наверх
 
IP записан
 
SashaL
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 41
Зарегистрирован: 15. Октября 2008
Re: Помогите соединить Индексированные таблицы
Ответ #2 - 14. Августа 2013 :: 11:05
Печать  
Вот текст запроса (не пинайте сильно Улыбка ) к базе на DBF. Просто в самом запросе я не придумал как это слепить. Может через ИТЗ будет проще?
Код
Выбрать все
тЗапроса = "
		|SELECT
		|	*
		|FROM
		|	(
		|	SELECT
		|       $ДокР.Клиент as [Покупатель $Справочник.Контрагенты],
		|		$ДокР.АдресСсылка as [Адрес $Справочник.Адреса],
		|		$ДокР.Экспедитор as [Экспедитор $Справочник.Сотрудники],
		|		ВыборкаТоваров.ЭлементРодитель as [Родитель $Справочник.Номенклатура],
		|		ВыборкаТоваров.глЭлементРодитель as [гРодитель $Справочник.Номенклатура],
		|		$ДокСР.Товар as [Товар $Справочник.Номенклатура],
		|		ВыборкаТоваров.Коэффициент,
		|		ВыборкаТоваров.int_RuCase,
		|		SUM($ДокСР.Количество) as итКол,
		|		SUM($ДокСР.Количество*ВыборкаТоваров.Вес) as итВес,
		|		SUM(($ДокСР.Количество*ВыборкаТоваров.int_RuCase)/ВыборкаТоваров.Коэффициент) as итРК,
		|		SUM($ДокСР.Количество*ВыборкаТоваров.int_Density) as итЛит,
		|		SUM($ДокСР.НДС) as СуммаНДС,
		|		SUM(0) as СуммаНДСВ,
		|		SUM($ДокСР.Сумма) as Оборот,
		|		SUM(0) as ОборотВ,
		|		SUM($ДокСР.Количество) as КоличествоРасход
		|	FROM
		|		$ДокументСтроки.РасходнаяНакладная as ДокСР
		|	LEFT JOIN
		|		1SJourn Жур on ДокСР.IDDoc =  Жур.IDDoc
		|	LEFT JOIN
		|		(
		|		SELECT    
		|			$спрТов.Вес as Вес,                
		|			$спрТов.int_RuCase as int_RuCase,
		|			$спрТов.int_Density as int_Density,
		|			$спрТов.ЕдиницаУпаковки,
		|			$Единицы.Коэффициент as Коэффициент,
		|			спрТов.ParentID as ЭлементРодитель,  
		|			Родит.ParentID as глЭлементРодитель,
		|			спрТов.ID as ID
		|		 FROM
		|			$Справочник.Номенклатура as спрТов
		|		 LEFT JOIN
		|			$Справочник.Единицы Единицы on $спрТов.ЕдиницаУпаковки = Единицы.ID  
		|		 LEFT JOIN
		|			$Справочник.Номенклатура Родит on спрТов.ParentID = Родит.ID
		|		)
		|		as ВыборкаТоваров on ВыборкаТоваров.ID = $ДокСР.Товар
		|	LEFT JOIN
		|		$Документ.РасходнаяНакладная as ДокР ON ДокР.IDDoc = ДокСР.IDDoc
		|	WHERE
		|		Жур.Date BETWEEN :НачДата~~ AND :КонДата~~ AND
		|		Жур.Closed = 1 AND
		|		$ДокР.Клиент IN (Select Val From :Покупатели) AND
		|		$ДокСР.Товар IN (Select Val From :Товары) AND
		|       $ДокР.Экспедитор IN (Select Val From :Торговые)  AND
    	|		$ДокР.Клиент IN (Select Val From :выбПокупатели)
        |   GROUP BY оваров.int_RuCase
		|	UNION ALL
		|	SELECT
		|       $ДокП.Клиент as [Покупатель $Справочник.Контрагенты],
		|		$ДокП.АдресСсылка as [Адрес $Справочник.Адреса],
		|		$ДокП.Экспедитор as [Экспедитор $Справочник.Сотрудники],
		|		ВыборкаТоваров.ЭлементРодитель as [Родитель $Справочник.Номенклатура],
		|		ВыборкаТоваров.глЭлементРодитель as [гРодитель $Справочник.Номенклатура],
		|		$ДокСП.Товар as [Товар $Справочник.Номенклатура],
		|		ВыборкаТоваров.Коэффициент,
		|		ВыборкаТоваров.int_RuCase,
		|		SUM(-1*$ДокСП.Количество) as итКол,
		|		SUM(-1*$ДокСП.Количество*ВыборкаТоваров.Вес) as итВес,
		|		 as итРК,
		|		SUM(-1*$ДокСП.Количество*ВыборкаТоваров.int_Density) as итЛит,
		|		SUM(-1*$ДокСП.НДС) as СуммаНДС,
		|		SUM(0) as СуммаНДСВ,
		|		SUM(-1*$ДокСП.Сумма) as Оборот,
		|		SUM(0) as ОборотВ,
		|		SUM(-1*$ДокСП.Количество) as КоличествоРасход
		|	FROM
		|		$ДокументСтроки.ПриходнаяНакладная as ДокСП
		|	LEFT JOIN
		|		1SJourn Жур on ДокСП.IDDoc =  Жур.IDDoc
		|	LEFT JOIN
		|		(
		|		SELECT    
		|			$спрТов.Вес as Вес,                
		|			$спрТов.int_RuCase as int_RuCase,
		|			$спрТов.int_Density as int_Density,
		|			$спрТов.ЕдиницаУпаковки,
		|			$Единицы.Коэффициент as Коэффициент,
		|			спрТов.ParentID as ЭлементРодитель,
		|			Родит.ParentID as глЭлементРодитель,
		|			спрТов.ID as ID
		|		 FROM
		|			$Справочник.Номенклатура as спрТов
		|		 LEFT JOIN
		|			$Справочник.Единицы Единицы on $спрТов.ЕдиницаУпаковки = Единицы.ID
		|		 LEFT JOIN
		|			$Справочник.Номенклатура Родит on спрТов.ParentID = Родит.ID
		|		)
		|		as ВыборкаТоваров on ВыборкаТоваров.ID = $ДокСП.Товар
		|	LEFT JOIN
		|		$Документ.ПриходнаяНакладная as ДокП ON ДокП.IDDoc = ДокСП.IDDoc
		|	WHERE
		|		Жур.Date BETWEEN :НачДата~~ AND :КонДата~~ AND
		|		Жур.Closed = 1  AND
		|		$ДокП.Клиент IN (Select Val From :Покупатели) AND
		|		$ДокСП.Товар IN (Select Val From :Товары) AND
		|       $ДокП.Экспедитор IN (Select Val From :Торговые) AND
		|		$ДокП.Клиент IN (Select Val From :выбПокупатели)
		|   GROUP BY оваров.int_RuCase
		|	) as Выборка
		|"; 

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



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Помогите соединить Индексированные таблицы
Ответ #3 - 14. Августа 2013 :: 11:11
Печать  
а вторая ИтЗ откуда ?
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Помогите соединить Индексированные таблицы
Ответ #4 - 14. Августа 2013 :: 11:12
Печать  
выкини типизацию из юнионов

получать глЭлементРодитель тоже нет смысла, проще потом в ИТЗ
получить всю иерархию.
  
Наверх
 
IP записан
 
SashaL
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 41
Зарегистрирован: 15. Октября 2008
Re: Помогите соединить Индексированные таблицы
Ответ #5 - 14. Августа 2013 :: 11:12
Печать  
Вторая получена из первой  Круглые глаза

ИндексГруппы = СоздатьОбъект("ИндексированнаяТаблица");      ИндексТЗ.Выгрузить(ИндексГруппы,,"гРодитель,Родитель",1);
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Помогите соединить Индексированные таблицы
Ответ #6 - 14. Августа 2013 :: 11:18
Печать  
в общем, если пользуешь oledb, то нужно задействовать индекс при всех соединениях
http://www.1cpp.ru/forum/YaBB.pl?num=1184317705

ну и я бы сделал просто юнион, обернул бы в подзсапрос, на выходе лефт джоин единицы для получения веса.

На выходе ИТЗ группировать с иерархией по номенклатуре и рекурсивный обход этой ИТЗ для вывода в отчет.

ЗЫ: да, выкинул бы получение parentid из запроса.
  
Наверх
 
IP записан
 
SashaL
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 41
Зарегистрирован: 15. Октября 2008
Re: Помогите соединить Индексированные таблицы
Ответ #7 - 14. Августа 2013 :: 11:26
Печать  
Благодарю за пинки в нужном направлении.
По поводу рекурсивного обхода ТЗ... ведь фактически нужна группировка аналог 1сной Все ВошедшиеВЗапрос, так как итоговый макет имеет колонки по группам товара. Вот на этом моменте совсем туплю (
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Помогите соединить Индексированные таблицы
Ответ #8 - 14. Августа 2013 :: 11:32
Печать  
А тебе разве не просто вся иерархия нужна ?
По какому полю надо "все вошедшие в запрос " ?
  
Наверх
 
IP записан
 
SashaL
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 41
Зарегистрирован: 15. Октября 2008
Re: Помогите соединить Индексированные таблицы
Ответ #9 - 14. Августа 2013 :: 11:40
Печать  
Eprst писал(а) 14. Августа 2013 :: 11:32:
По какому полю надо "все вошедшие в запрос " ?


Экспедитор
-Покупатель
--Адрес

- это в строки макета

гРодитель
Родитель
Товар (опционально)

- это колонки макета, то есть по ним и нужно все вошедшие в запрос, так как на пересечении строки и нужной группы товара выводить значения (вес, кол-во, сумма).
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Помогите соединить Индексированные таблицы
Ответ #10 - 14. Августа 2013 :: 11:58
Печать  
как это колонки ?
У тебя же элемент может и не принадлежать этой группе.
  
Наверх
 
IP записан
 
SashaL
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 41
Зарегистрирован: 15. Октября 2008
Re: Помогите соединить Индексированные таблицы
Ответ #11 - 14. Августа 2013 :: 12:17
Печать  
Eprst писал(а) 14. Августа 2013 :: 11:58:
как это колонки ?
У тебя же элемент может и не принадлежать этой группе.


Обязательно принадлежит этой группе. Вот как выглядит макет чтобы было более понятно

  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать