Переключение на Главную Страницу Страницы: [1] 2  ОтправитьПечать
Горячая тема (более 10 ответов) Запрос с UNION ALL, 2 вида документов.. (число прочтений - 6311 )
Malamute
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 17
Зарегистрирован: 29. Июня 2010
Запрос с UNION ALL, 2 вида документов..
29. Июня 2010 :: 21:45
Печать  
Здравствуйте.

Прошу подтолкнуть в нужном направлении...

1С семерка ТиС
Цель такая: получить табличку

|Номенклатура|Документ|КолПост|КолРеал

при этом в колонке "Документ" должны идти по хронологии документы ПоступлениеТМЦ и Реализация (разные типы доков, но колонка одна).

Написал 2 прямых запроса, которые работают.

Как бы теперь объединить результат в одну таблицу (которая мне нужна)


Запрос 1
       ТекстЗапроса = "
     |SELECT
     |      ПоступлениеТМЦ.IDDOC as [Документ $Документ.ПоступлениеТМЦ],
     |      $ПоступлениеТМЦ.Номенклатура as [Номенклатура $Справочник.Номенклатура],  
     |      SUM($ПоступлениеТМЦ.Количество) as [КолПост]
     |FROM
     |      $ДокументСтроки.ПоступлениеТМЦ AS ПоступлениеТМЦ
     |INNER JOIN
     |      _1SJOURN AS Жур  ON ПоступлениеТМЦ.IDDOC = Жур.IDDOC
     |WHERE (Жур.DATE_TIME_IDDOC BETWEEN :НачДата AND :КонДата~)
     |      AND ($ПоступлениеТМЦ.Номенклатура IN (SELECT Val FROM #ГруппаНом))
     |GROUP BY
     |    $ПоступлениеТМЦ.Номенклатура, ПоступлениеТМЦ.IDDOC
     |ORDER BY
     |$ПоступлениеТМЦ.Номенклатура
     |";


Запрос 2

     ТекстЗапроса = "
     |SELECT
     |      Реализация.IDDOC as [Документ $Документ.Реализация],
     |      $Реализация.Номенклатура as [Номенклатура $Справочник.Номенклатура],  
     |      SUM($Реализация.Количество) as [КолРеал]
     |FROM
     |      $ДокументСтроки.Реализация AS Реализация
     |INNER JOIN
     |      _1SJOURN AS Жур  ON Реализация.IDDOC = Жур.IDDOC
     |WHERE (Жур.DATE_TIME_IDDOC BETWEEN :НачДата AND :КонДата~)
     |      AND ($Реализация.Номенклатура IN (SELECT Val FROM #ГруппаНом))
     |GROUP BY
     |    $Реализация.Номенклатура, Реализация.IDDOC
     |ORDER BY
     |$Реализация.Номенклатура
     |";


Пытаюсь пристроить обертку

     |SELECT T.Документ as [Док $Документ]      
     |FROM(

           Запрос 1

           UNION ALL

           Запрос 2) AS T

(ORDER BY выкинул из каждого запроса конечно, тут и GROUP BY лишнее будет внутри в моем случае, но тут не суть проблемы думаю)

пишет Invalid column name 'Документ'

что-то мне подсказывает намудрил то ли с одинаковыми алиасами,
то ли объединять разные типы таким образом нельзя...
Типизацию наверху пробовал убирать.
Темы похожие читал, что-то не соображу...
Оч мало опыта с прямыми запросами, использую их как костыли местами пока, хотя костыли получаются хорошие, на них летают Улыбка а вот понимание не пришло еще....

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


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Запрос с UNION ALL, 2 вида документов..
Ответ #1 - 30. Июня 2010 :: 04:15
Печать  
добавь в select и в group by  IDDocDef
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Запрос с UNION ALL, 2 вида документов..
Ответ #2 - 30. Июня 2010 :: 05:48
Печать  
Типизации из внутренних запросов убирай. Всё вытаскивай на верх
  
Наверх
 
IP записан
 
Anatol
Senior Member
****
Отсутствует


тыц, пыц, тыц!!!

Сообщений: 412
Зарегистрирован: 24. Апреля 2009
Re: Запрос с UNION ALL, 2 вида документов..
Ответ #3 - 30. Июня 2010 :: 06:01
Печать  
Примерно так:


Код
Выбрать все
    SELECT  Документ AS [Документ $Документ]
		     , Документ_Вид
		     , Номенклатура AS [Номенклатура $Справочник.Номенклатура]
		     , sum(КолПост) AS КолПост
		     , sum(КолРеал) AS КолРеал
From(
    |SELECT
     |	ПоступлениеТМЦ.IDDOC as Документ,
		ПоступлениеТМЦ.IDDocDef as Документ_Вид,
     |	$ПоступлениеТМЦ.Номенклатура as Номенклатура,
     |	SUM($ПоступлениеТМЦ.Количество) as КолПост
		, 0 AS КолРеал
     |FROM
     |	$ДокументСтроки.ПоступлениеТМЦ AS ПоступлениеТМЦ
     |INNER JOIN
     |	_1SJOURN AS Жур  ON ПоступлениеТМЦ.IDDOC = Жур.IDDOC
     |WHERE (Жур.DATE_TIME_IDDOC BETWEEN :НачДата AND :КонДата~)
     |	AND ($ПоступлениеТМЦ.Номенклатура IN (SELECT Val FROM #ГруппаНом))

     UNION ALL

     |SELECT
     |	Реализация.IDDOC as[Документ,
		Реализация.IDDocDef as Документ_Вид,
     |	$Реализация.Номенклатура as Номенклатура,
     |	SUM($Реализация.Количество) as КолРеал
		 , 0 AS КолПост
     |FROM
     |	$ДокументСтроки.Реализация AS Реализация
     |INNER JOIN
     |	_1SJOURN AS Жур  ON Реализация.IDDOC = Жур.IDDOC
     |WHERE (Жур.DATE_TIME_IDDOC BETWEEN :НачДата AND :КонДата~)
     |	AND ($Реализация.Номенклатура IN (SELECT Val FROM #ГруппаНом))
 ) AS Итоги

Group By Итоги.Документ, Итоги.Документ_Вид, Итоги.Номенклатура
Order By Итоги.Документ 

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



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Запрос с UNION ALL, 2 вида документов..
Ответ #4 - 30. Июня 2010 :: 06:06
Печать  
местами перепутал количество реализации и количество поступления в селекте.
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Запрос с UNION ALL, 2 вида документов..
Ответ #5 - 30. Июня 2010 :: 06:12
Печать  
и не забываем про условие по IDDocDef=Вид
  

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


тыц, пыц, тыц!!!

Сообщений: 412
Зарегистрирован: 24. Апреля 2009
Re: Запрос с UNION ALL, 2 вида документов..
Ответ #6 - 30. Июня 2010 :: 06:41
Печать  
и еще одна поправка вид документа хранится в журнале

Реализация.IDDocDef as Документ_Вид
и
ПоступлениеТМЦ.IDDocDef  as Документ_Вид

заменить на

Жур.IDDocDef as Документ_Вид,
  
Наверх
wwwICQ  
IP записан
 
Malamute
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 17
Зарегистрирован: 29. Июня 2010
Re: Запрос с UNION ALL, 2 вида документов..
Ответ #7 - 30. Июня 2010 :: 18:34
Печать  
Спасибо всем огромное буду пробовать!..
  
Наверх
 
IP записан
 
Malamute
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 17
Зарегистрирован: 29. Июня 2010
Re: Запрос с UNION ALL, 2 вида документов..
Ответ #8 - 18. Июля 2010 :: 12:47
Печать  
Добрый день!
Еще раз спасибо всем кто помогал...
Я долго тормозил с результатом - форсмажор был на работе.
Теперь вот добиваю...

И что-то бред выходит -
Одинэсина мне пишет "Для типизации поля "Документ" не найдено дополнительное типизирующее поле.
Хотя вроде всё на месте


     
     |SELECT Документ  AS [Документ $Документ],
     | Документ_Вид      ,
     | Номенклатура AS [Номенклатура $Справочник.Номенклатура] ,
     | sum(КолПост) AS КолПост,
     | sum(КолРеал) AS КолРеал      
     
     |FROM(
     
     |SELECT
     |      ПоступлениеТМЦ.IDDOC as Документ,
     |Жур.IDDocDef as Документ_Вид,
     |      $ПоступлениеТМЦ.Номенклатура as Номенклатура,  
     |      SUM($ПоступлениеТМЦ.Количество) as КолПост  ,
     |0 as КолРеал
     |FROM
     |      $ДокументСтроки.ПоступлениеТМЦ AS ПоступлениеТМЦ
     |INNER JOIN
     |      _1SJOURN AS Жур  ON ПоступлениеТМЦ.IDDOC = Жур.IDDOC  
     |WHERE (Жур.DATE_TIME_IDDOC BETWEEN :НачДата AND :КонДата~)
     |      AND ($ПоступлениеТМЦ.Номенклатура IN (SELECT Val FROM #ГруппаНом))
     |GROUP BY
     |    $ПоступлениеТМЦ.Номенклатура, ПоступлениеТМЦ.IDDOC,Жур.IDDocDef
     |
     |UNION ALL      
     |
     |SELECT
     |      Реализация.IDDOC as Документ,  
     |Жур.IDDocDef as Документ_Вид,
     
     |      $Реализация.Номенклатура as Номенклатура ,  
     |      SUM($Реализация.Количество) as КолРеал,
     |0 as КолПост
     |FROM
     |      $ДокументСтроки.Реализация AS Реализация
     |INNER JOIN
     |      _1SJOURN AS Жур  ON Реализация.IDDOC = Жур.IDDOC
     |WHERE (Жур.DATE_TIME_IDDOC BETWEEN :НачДата AND :КонДата~)
     |      AND ($Реализация.Номенклатура IN (SELECT Val FROM #ГруппаНом))
     |GROUP BY
     |    $Реализация.Номенклатура, Реализация.IDDOC,Жур.IDDocDef
     |)AS Итоги
     
     |Group By Итоги.Документ, Итоги.Документ_Вид, Итоги.Номенклатура
     |Order By Итоги.Документ
     
     |";


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


Я всего лишь als-особиратель
;-)

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Запрос с UNION ALL, 2 вида документов..
Ответ #9 - 18. Июля 2010 :: 14:20
Печать  
Документ_вид - "вид" - чувствительно к регистру.
  

Отхожу от дел. Долго и мучительно.
Наверх
IP записан
 
Malamute
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 17
Зарегистрирован: 29. Июня 2010
Re: Запрос с UNION ALL, 2 вида документов..
Ответ #10 - 18. Июля 2010 :: 14:45
Печать  
Спасибо!
Ошибку вываливать перестало, но теперь результат -пустую ТЗ показывает....
  
Наверх
 
IP записан
 
pavel_tr
Senior Member
****
Отсутствует



Сообщений: 279
Местоположение: Казань
Зарегистрирован: 14. Октября 2006
Пол: Мужской
Re: Запрос с UNION ALL, 2 вида документов..
Ответ #11 - 18. Июля 2010 :: 14:58
Печать  
Итоги.Документ_Вид as Документ_вид
  
Наверх
 
IP записан
 
Malamute
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 17
Зарегистрирован: 29. Июня 2010
Re: Запрос с UNION ALL, 2 вида документов..
Ответ #12 - 18. Июля 2010 :: 15:18
Печать  
Пустая ТЗ была по невнимательности - в форме не выбрал номенклатуру.... а надо было.

Что имею в результате - работает и в варианте "Итоги.Документ_вид" наверху, и просто "Документ_вид".

А в ТЗ показывает

Реализации, Номенклатуру, КолПост , и КолРеал везде нули....

Документ      | Документ_вид|Номенклатура  |КолПост|КолРеал
Реализация1|1611                |Номенклатура1|5          |0

Поступления не отображаются вообще, хотя КолПост отображаются
и соответствуют реальным кол-вам в поступлениях.
(сегодня писал еще один запрос, с Union All, но к двум регистрам - тоже кол-ва только из одного регистра показывались,
из того который в первом запросе внутри,
еще не победил.
Где-то явно системная ошибка... )
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Запрос с UNION ALL, 2 вида документов..
Ответ #13 - 18. Июля 2010 :: 16:24
Печать  
У тебя в первом запросе после поля Номенклатура идет поле "КолРеал", а во втором - "КолПост". Поля во всех запросах дожны идти в одинаковом порядке.

И группировки во внутренних запросах, ИМХО, не нужны, раз ты потом всё еще раз группируешь наверху
  
Наверх
 
IP записан
 
Malamute
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 17
Зарегистрирован: 29. Июня 2010
Re: Запрос с UNION ALL, 2 вида документов..
Ответ #14 - 18. Июля 2010 :: 17:17
Печать  
Да я пробовал без группировок внутри сначала - сам вверху писал что они не нужны. Только без них не заработало - ругалось что
Column 'ПоступлениеТМЦ.IDDOC' is invalid in the select list because it is not contained in an aggregate function and there is no GROUPE BY clause
- и так на всё что во внутренних селектах....

Местами переставил КолПост и КолРеал... теперь в колонке КолРеал появились количества совершенно не соответствующие Реализациям слева, а КолПост стало по нулям;
Поступления в колонке "Документ" не появились....

     |SELECT Документ  AS [Документ $Документ],
     | Документ_вид      ,
     | Номенклатура AS [Номенклатура $Справочник.Номенклатура] ,
     | sum(КолПост) AS КолПост,
     | sum(КолРеал) AS КолРеал      
     
     |FROM(
     
     |SELECT
     |      ПоступлениеТМЦ.IDDOC as Документ,
     |Жур.IDDocDef as Документ_вид,
     |      $ПоступлениеТМЦ.Номенклатура as Номенклатура,  
     |      SUM($ПоступлениеТМЦ.Количество) as КолПост  ,
     |0 as КолРеал
     |FROM
     |      $ДокументСтроки.ПоступлениеТМЦ AS ПоступлениеТМЦ
     |INNER JOIN
     |      _1SJOURN AS Жур  ON ПоступлениеТМЦ.IDDOC = Жур.IDDOC  
     |WHERE (Жур.DATE_TIME_IDDOC BETWEEN :НачДата AND :КонДата~)
     |      AND ($ПоступлениеТМЦ.Номенклатура IN (SELECT Val FROM #ГруппаНом))
     |GROUP BY
     |    $ПоступлениеТМЦ.Номенклатура, ПоступлениеТМЦ.IDDOC,Жур.IDDocDef
     |
     |UNION ALL      
     |
     |SELECT
     |      Реализация.IDDOC as Документ,  
     |Жур.IDDocDef as Документ_вид,
     
     |      $Реализация.Номенклатура as Номенклатура ,
     |0 as КолПост,
     |      SUM($Реализация.Количество) as КолРеал

     |FROM
     |      $ДокументСтроки.Реализация AS Реализация
     |INNER JOIN
     |      _1SJOURN AS Жур  ON Реализация.IDDOC = Жур.IDDOC
     |WHERE (Жур.DATE_TIME_IDDOC BETWEEN :НачДата AND :КонДата~)
     |      AND ($Реализация.Номенклатура IN (SELECT Val FROM #ГруппаНом))
     |GROUP BY
     |    $Реализация.Номенклатура, Реализация.IDDOC,Жур.IDDocDef
     |)AS Итоги
     
     |Group By Итоги.Документ, Итоги.Документ_вид, Итоги.Номенклатура
     |Order By Итоги.Документ
     
     |";
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 
ОтправитьПечать