Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Горячая тема (более 10 ответов) Как преобразовать запрос? (число прочтений - 3535 )
zeek
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 24
Зарегистрирован: 16. Апреля 2008
Как преобразовать запрос?
28. Мая 2009 :: 08:49
Печать  
Есть стандартный запрос по двум регистрам:
Код
Выбрать все
Товар=Регистр.ОстаткиТоваров.Товар,Регистр.ОстаткиВнеСклада.Товар;
;
Группировка Товар;
Функция ОстКоличество=КонОст(Количество); 


Можно как-то преобразовать прямой запрос чтобы было не четыре колонки как здесь
Код
Выбрать все
SELECT ОстаткиТоваровОстатки.Товар [Товар $Справочник.Товары]
	, ОстаткиВнеСкладаОстатки.Товар [ОстаткиВнеСкладаОстаткиТовар $Справочник.Товары]
	, Sum(ОстаткиТоваровОстатки.КоличествоОстаток) СуммаКоличествоОстаток
	, Sum(ОстаткиВнеСкладаОстатки.КоличествоОстаток) СуммаОстаткиВнеСкладаОстаткиКоличествоОстаток
FROM $РегистрОстатки.ОстаткиТоваров(,,,,
		Количество) AS ОстаткиТоваровОстатки
	CROSS JOIN $РегистрОстатки.ОстаткиВнеСклада(,,,
		Товар,
		Количество) AS ОстаткиВнеСкладаОстатки
GROUP BY ОстаткиТоваровОстатки.Товар
	, ОстаткиВнеСкладаОстатки.Товар 


а две как в первом
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3050
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Как преобразовать запрос?
Ответ #1 - 28. Мая 2009 :: 08:54
Печать  
приведи запрос не к соединению, а к объединению т.е. не cross join, а union all
  

1&&2&&3
Наверх
 
IP записан
 
U_zer
Экс-Участник


Re: Как преобразовать запрос?
Ответ #2 - 28. Мая 2009 :: 08:54
Печать  
zeek писал(а) 28. Мая 2009 :: 08:49:
Есть стандартный запрос по двум регистрам:
Код
Выбрать все
Товар=Регистр.ОстаткиТоваров.Товар,Регистр.ОстаткиВнеСклада.Товар;
;
Группировка Товар;
Функция ОстКоличество=КонОст(Количество); 


Можно как-то преобразовать прямой запрос чтобы было не четыре колонки как здесь
Код
Выбрать все
SELECT ОстаткиТоваровОстатки.Товар [Товар $Справочник.Товары]
	, ОстаткиВнеСкладаОстатки.Товар [ОстаткиВнеСкладаОстаткиТовар $Справочник.Товары]
	, Sum(ОстаткиТоваровОстатки.КоличествоОстаток) СуммаКоличествоОстаток
	, Sum(ОстаткиВнеСкладаОстатки.КоличествоОстаток) СуммаОстаткиВнеСкладаОстаткиКоличествоОстаток
FROM $РегистрОстатки.ОстаткиТоваров(,,,,
		Количество) AS ОстаткиТоваровОстатки
	CROSS JOIN $РегистрОстатки.ОстаткиВнеСклада(,,,
		Товар,
		Количество) AS ОстаткиВнеСкладаОстатки
GROUP BY ОстаткиТоваровОстатки.Товар
	, ОстаткиВнеСкладаОстатки.Товар 


а две как в первом


Используй Union
  
Наверх
 
IP записан
 
zeek
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 24
Зарегистрирован: 16. Апреля 2008
Re: Как преобразовать запрос?
Ответ #3 - 28. Мая 2009 :: 11:26
Печать  
На каждый регистр делать Select и потом соединять через Union. Я правильно понял?
  
Наверх
 
IP записан
 
U_zer
Экс-Участник


Re: Как преобразовать запрос?
Ответ #4 - 28. Мая 2009 :: 12:01
Печать  
zeek писал(а) 28. Мая 2009 :: 11:26:
На каждый регистр делать Select и потом соединять через Union. Я правильно понял?


Ну да, типа:
Код
Выбрать все
select
....
from (
select
......
from
union
select
......
from
)
 

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


I Love YaBB 2!

Сообщений: 24
Зарегистрирован: 16. Апреля 2008
Re: Как преобразовать запрос?
Ответ #5 - 28. Мая 2009 :: 12:13
Печать  
Пасибо!
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3050
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Как преобразовать запрос?
Ответ #6 - 28. Мая 2009 :: 12:20
Печать  
важно!!!
не union, а union all
  

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



Сообщений: 287
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Как преобразовать запрос?
Ответ #7 - 28. Мая 2009 :: 12:51
Печать  
trad писал(а) 28. Мая 2009 :: 12:20:
важно!!!
не union, а union all

+1:

UNION
Указывает на то, что несколько результирующих наборов следует объединить и возвратить в виде единого результирующего набора.

ALL
Объединяет в результирующий набор все строки. Это относится и к дублирующимся строкам. Если обратное не указано, дубликаты строк удаляются.
  
Наверх
IP записан
 
zeek
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 24
Зарегистрирован: 16. Апреля 2008
Re: Как преобразовать запрос?
Ответ #8 - 11. Июня 2009 :: 12:01
Печать  
А как прямом запросе сделать аналог
Код
Выбрать все
Группировка Склад Все; 

  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Как преобразовать запрос?
Ответ #9 - 11. Июня 2009 :: 12:39
Печать  
Full Join

если не только склады, но и номенклатура ВСЕ, то предварительно
декартовово произведение по складам и номенклатуре

но имхо может быть очень большим (100 000*20 складов) -
лучше нафиг - при выводе
  
Наверх
 
IP записан
 
zeek
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 24
Зарегистрирован: 16. Апреля 2008
Re: Как преобразовать запрос?
Ответ #10 - 11. Июня 2009 :: 13:24
Печать  
А на примере можно?
Код
Выбрать все
SELECT ОстаткиТовараОстатки.Товар [Товар $Справочник.Товары]
	, ОстаткиТовараОстатки.Склад [Склад $Справочник.Склады]
	, Sum(ОстаткиТовараОстатки.КоличествоОстаток) СуммаКоличествоОстаток
FROM $РегистрОстатки.ОстаткиТовара(,,,,
		Количество) AS ОстаткиТовараОстатки
GROUP BY ОстаткиТовараОстатки.Товар
	, ОстаткиТовараОстатки.Реализатор 


Куда FULL JOIN лепить в строку соединения при получениии остатков?
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Как преобразовать запрос?
Ответ #11 - 11. Июня 2009 :: 18:41
Печать  
после from, со спр склады
в пример вставить не могу - т.к. он по моему не рабочий
  
Наверх
 
IP записан
 
zeek
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 24
Зарегистрирован: 16. Апреля 2008
Re: Как преобразовать запрос?
Ответ #12 - 12. Июня 2009 :: 06:14
Печать  
kiruha писал(а) 11. Июня 2009 :: 18:41:
после from, со спр склады
в пример вставить не могу - т.к. он по моему не рабочий

Да но мне надо чтобы в результат попли те склады на которых есть какие-то остаки, а так получится что в результат попадут склады на которых нет остаков вообще.
  
Наверх
 
IP записан
 
zeek
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 24
Зарегистрирован: 16. Апреля 2008
Re: Как преобразовать запрос?
Ответ #13 - 12. Июня 2009 :: 09:02
Печать  
При FULL JOIN выдает только первую строку с нулями, а дальше остальные остатки.А надо чтобы результат был примерно такой
Товар     Склад1 Склад2 Склад3
Ручка    0  2  1
Носки    1  0  0
Чашки  1  2  3
А склады на которых вообще нет остатков соответсвенно не попадали в результат, в общем аналогия "Все ВошедниеВЗапрос".
  
Наверх
 
IP записан
 
Вадимко
God Member
*****
Отсутствует


Нам бы чего про ОдноЦэ...

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Как преобразовать запрос?
Ответ #14 - 12. Июня 2009 :: 09:29
Печать  
Ну ч что?
Делай
Селект Сум(Запрос.А)
, Сум(Запрос.Б)
, Запрос.Склад
, Запрос.Товар
Фром (
Селект А А
, 0 Б
, Склад
, Товар
Фром Остатки по складу
Юнион олл
Селект 0 А
, Б Б
, Склад
, Товар
Остатки вне склада
) Аз Запрос
Груп бай Товар, Склад

И все, выгружаешь список товаров и складов
Перебираешь товары в цикле и склады внутри них, присоединяя секции
Разруливаешь при обходе с помощью индексированной таблицы или обычной ТЗ, где остатка нет - нули
Зачем насиловать сервер декартовыми произведениями?
  

Кампутер, кофе и сигареты - это очень плохо для моего здоровья...
Наверх
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать