Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема помогите новичку с запросом (число прочтений - 2928 )
Николай_31
YaBB Newbies
*
Отсутствует



Сообщений: 4
Местоположение: Белгород
Зарегистрирован: 12. Декабря 2016
Пол: Мужской
помогите новичку с запросом
12. Декабря 2016 :: 13:07
Печать  
Не пинайте сильно, сталкивался изредка и только с простыми запросами...
Надо выбрать данные по возвратам товаров с указанием кто из сотрудников работал в этот день
Запрос к Табличным частям документов _Табель, ВозвратОтПокупателя

Для теста выбрал день, где работал 1 сотрудник и был возврат одного товара
через UNION ALL - получаю 2 строки, а мне надо чтобы было все в 1

через Inner Join - не получилось вообще ничего(

[code c++]
                 |SELECT
                 |      NullIf(Cast(Left(Журнал.DATE_TIME_IDDOC, 8) AS datetime), '17530101') ДатаДокум
                 |      ,Журнал.$ОбщийРеквизит.Фирма [Фирма $Справочник.Фирмы]   
                 |
                 |      ,$_ТабельСтроки.Сотрудник [Сотрудник $Справочник.ФизЛица]
                 |                  
                 |      ,NULL as [Номенклатура $Справочник.Номенклатура] 
                 |      ,NULL as КолВоПродажи
                 |      ,NULL as СуммаПродажи
                 |
                 |      FROM _1SJOURN AS Журнал
                 |
                 |INNER JOIN $ДокументСтроки._Табель AS _ТабельСтроки ON Журнал.IDDOC = _ТабельСтроки.IDDOC 
                 |
                 |WHERE ((Журнал.CLOSED & 1) = 1)
                 |      AND (Журнал.$ОбщийРеквизит.Фирма IN (SELECT Val FROM #sqlВыбФирма))
                 |      AND (Журнал.Date_Time_IDDoc BETWEEN :ДатаНачала AND :ДатаКонца~)
                 |
                 |GROUP BY
                 |      Журнал.$ОбщийРеквизит.Фирма
                 |      ,Журнал.DATE_TIME_IDDOC
                 |      ,$_ТабельСтроки.Сотрудник
                 |
                 |
                 |UNION ALL   
                 |
                 |
                 |SELECT
                 |      NullIf(Cast(Left(Журнал.DATE_TIME_IDDOC, 8) AS datetime), '17530101') ДатаДокум
                 |      ,Журнал.$ОбщийРеквизит.Фирма [Фирма $Справочник.Фирмы]   
                 |                  
                 |      ,NULL as [Сотрудник $Справочник.ФизЛица]
                 |                  
                 |      ,$ВозвратОтПокупателяСтроки.Номенклатура [Номенклатура $Справочник.Номенклатура]
                 |      ,Sum($ВозвратОтПокупателяСтроки.Количество)*(-1) КолВоПродажи
                 |      ,Sum($ВозвратОтПокупателяСтроки.Сумма)*(-1) СуммаПродажи
                 |      
                 |      FROM _1SJOURN AS Журнал
                 |
                 |INNER JOIN $ДокументСтроки.ВозвратОтПокупателя AS ВозвратОтПокупателяСтроки ON Журнал.IDDOC = ВозвратОтПокупателяСтроки.IDDOC   
                 |
                 |WHERE ((Журнал.CLOSED & 1) = 1)
                 |      AND ($ВозвратОтПокупателяСтроки.Номенклатура IN (SELECT Val FROM #sqlВыбНоменклатура))
                 |      AND (Журнал.$ОбщийРеквизит.Фирма IN (SELECT Val FROM #sqlВыбФирма))
                 |      AND (Журнал.Date_Time_IDDoc BETWEEN :ДатаНачала AND :ДатаКонца~)
                 |
                 |GROUP BY
                 |      Журнал.$ОбщийРеквизит.Фирма
                 |      ,Журнал.DATE_TIME_IDDOC
                 |      ,$ВозвратОтПокупателяСтроки.Номенклатура   

[/code]
  
Наверх
IP записан
 
Djelf
God Member
*****
Отсутствует


Ubuntu + wine@etersoft
+ 1C 7.7

Сообщений: 633
Местоположение: Питер
Зарегистрирован: 02. Ноября 2007
Пол: Мужской
Re: помогите новичку с запросом
Ответ #1 - 12. Декабря 2016 :: 18:17
Печать  
Оберни свой запрос в select ... from select и еще раз сверни.
  
Наверх
www  
IP записан
 
Николай_31
YaBB Newbies
*
Отсутствует



Сообщений: 4
Местоположение: Белгород
Зарегистрирован: 12. Декабря 2016
Пол: Мужской
Re: помогите новичку с запросом
Ответ #2 - 12. Декабря 2016 :: 18:56
Печать  
Djelf писал(а) 12. Декабря 2016 :: 18:17:
Оберни свой запрос в select ... from select и еще раз сверни.


можно подробнее? к сожалению для меня это пока темный лес(
  
Наверх
IP записан
 
Djelf
God Member
*****
Отсутствует


Ubuntu + wine@etersoft
+ 1C 7.7

Сообщений: 633
Местоположение: Питер
Зарегистрирован: 02. Ноября 2007
Пол: Мужской
Re: помогите новичку с запросом
Ответ #3 - 12. Декабря 2016 :: 19:55
Печать  
Весь переписывать не буду, как то так он должен выглядеть.
Учти, типизацию в [] нужно делать ТОЛЬКО в первом SELECT!!!
Код (SQL)
Выбрать все
SELECT
    ВложенныйЗапрос.ДатаДокум
    ,sum(ВложенныйЗапрос.КолВоПродажи)
FROM (SELECT твой текст запроса) AS ВложенныйЗапрос
GROUP BY
    ВложенныйЗапрос.ДатаДокум
 

  
Наверх
www  
IP записан
 
Николай_31
YaBB Newbies
*
Отсутствует



Сообщений: 4
Местоположение: Белгород
Зарегистрирован: 12. Декабря 2016
Пол: Мужской
Re: помогите новичку с запросом
Ответ #4 - 13. Декабря 2016 :: 03:28
Печать  
Djelf писал(а) 12. Декабря 2016 :: 19:55:
Весь переписывать не буду, как то так он должен выглядеть.
Учти, типизацию в [] нужно делать ТОЛЬКО в первом SELECT!!!

типизацию исправил
обернул всё еще в один select

но что то разницы в результате я не увидел ((
Код (SQL)
Выбрать все
|SELECT
|	PODZAPROS.ДатаДокум
|	,PODZAPROS.Фирма [Фирма $Справочник.Фирмы]   
|	,PODZAPROS.Сотрудник [Сотрудник $Справочник.ФизЛица]
|	,PODZAPROS.Номенклатура [Номенклатура $Справочник.Номенклатура]
|	,Sum(PODZAPROS.КолВоПродажи) as Кол
|	,Sum(PODZAPROS.СуммаПродажи) as Сум
|
|from(
	|	select
	|	NullIf(Cast(Left(Журнал.DATE_TIME_IDDOC, 8) AS datetime), '17530101') ДатаДокум
	|	,Журнал.$ОбщийРеквизит.Фирма as Фирма
	|
	|	,$_ТабельСтроки.Сотрудник as Сотрудник
	|	,NULL as Номенклатура
	|	,NULL as КолВоПродажи
	|	,NULL as СуммаПродажи
	|
	|	FROM _1SJOURN AS Журнал
	|
	|INNER JOIN $ДокументСтроки._Табель AS _ТабельСтроки ON Журнал.IDDOC = _ТабельСтроки.IDDOC 
	|
	|WHERE ((Журнал.CLOSED & 1) = 1)
	|	AND (Журнал.$ОбщийРеквизит.Фирма IN (SELECT Val FROM #sqlВыбФирма))
	|	AND (Журнал.Date_Time_IDDoc BETWEEN :ДатаНачала AND :ДатаКонца~)
	|
	|GROUP BY
	|	Журнал.$ОбщийРеквизит.Фирма
	|	,Журнал.DATE_TIME_IDDOC
	|	,$_ТабельСтроки.Сотрудник         
	|      
	|UNION ALL
	|
	|SELECT
	|	NullIf(Cast(Left(Журнал.DATE_TIME_IDDOC, 8) AS datetime), '17530101') ДатаДокум
	|	,Журнал.$ОбщийРеквизит.Фирма  as Фирма   
	|
	|	,NULL as Сотрудник
	|	,$ВозвратОтПокупателяСтроки.Номенклатура as Номенклатура
	|	,Sum($ВозвратОтПокупателяСтроки.Количество)*(-1) КолВоПродажи
	|	,Sum($ВозвратОтПокупателяСтроки.Сумма)*(-1) СуммаПродажи
	|
	|	FROM _1SJOURN AS Журнал
	|
	|INNER JOIN $ДокументСтроки.ВозвратОтПокупателя AS ВозвратОтПокупателяСтроки ON Журнал.IDDOC = ВозвратОтПокупателяСтроки.IDDOC   
	|
	|WHERE ((Журнал.CLOSED & 1) = 1)
	|	AND ($ВозвратОтПокупателяСтроки.Номенклатура IN (SELECT Val FROM #sqlВыбНоменклатура))
	|	AND (Журнал.$ОбщийРеквизит.Фирма IN (SELECT Val FROM #sqlВыбФирма))
	|	AND (Журнал.Date_Time_IDDoc BETWEEN :ДатаНачала AND :ДатаКонца~)
	|
	|GROUP BY
	|	Журнал.$ОбщийРеквизит.Фирма
	|	,Журнал.DATE_TIME_IDDOC
	|	,$ВозвратОтПокупателяСтроки.Номенклатура 
	|
	|
	|) as PODZAPROS 
|      
|
|GROUP BY
|	PODZAPROS.ДатаДокум
|	,PODZAPROS.Фирма   
|	,PODZAPROS.Сотрудник
|	,PODZAPROS.Номенклатура 
|
 



насколько понимаю, группировка не выполняется из-за
Код (SQL)
Выбрать все
NULL as Номенклатура

NULL as Сотрудник
 



видимо надо как-то по другому объединять результаты запросов
ткните меня посильнее - в какую сторону копать?...
какие то JOIN надо использовать? но как? - не знаю(
https://yadi.sk/i/j_sCyo9233K9dc
  
Наверх
IP записан
 
Djelf
God Member
*****
Отсутствует


Ubuntu + wine@etersoft
+ 1C 7.7

Сообщений: 633
Местоположение: Питер
Зарегистрирован: 02. Ноября 2007
Пол: Мужской
Re: помогите новичку с запросом
Ответ #5 - 13. Декабря 2016 :: 09:12
Печать  
Эх... ну да, я не сильно внимательно посмотрел запрос...
Так у тебя ничего не получится.
Какая связь между сотрудниками в табеле и документами возврата, кроме фирмы и даты? Судя по виду вообще никакой...
Т.е. возвратов может быть 2, а сотрудников в табеле 5. Так каким образом ты определишь кто из них ответственный за возврат?
  
Наверх
www  
IP записан
 
Николай_31
YaBB Newbies
*
Отсутствует



Сообщений: 4
Местоположение: Белгород
Зарегистрирован: 12. Декабря 2016
Пол: Мужской
Re: помогите новичку с запросом
Ответ #6 - 13. Декабря 2016 :: 13:29
Печать  
Djelf писал(а) 13. Декабря 2016 :: 09:12:
Эх... ну да, я не сильно внимательно посмотрел запрос...
Так у тебя ничего не получится.
Какая связь между сотрудниками в табеле и документами возврата, кроме фирмы и даты? Судя по виду вообще никакой...
Т.е. возвратов может быть 2, а сотрудников в табеле 5. Так каким образом ты определишь кто из них ответственный за возврат?


ну да, явной связи нет
мне по сути надо продублировать строки возврата с разными сотрудниками из Табеля
т.е. если был возврат Товар1, а работало ДВА сотрудника
то в итоге должен получить таблицу с 2 записями
1. Товар1,СуммаВозврата,Иванов
2. Товар1,СуммаВозврата,Петров
как то это можно организовать на запросах?
голову поломал(
щас реализовал эту задачу несколькими разными запросами и в куче циклов по строкам Таблицы1 потом добавляю данные из Табл2, табл3
но так хочется сделать это красиво и тем более на прямых должно работать намного шутрее Круглые глаза
  
Наверх
IP записан
 
Djelf
God Member
*****
Отсутствует


Ubuntu + wine@etersoft
+ 1C 7.7

Сообщений: 633
Местоположение: Питер
Зарегистрирован: 02. Ноября 2007
Пол: Мужской
Re: помогите новичку с запросом
Ответ #7 - 13. Декабря 2016 :: 14:09
Печать  
Тогда тебе нужно первый запрос обернуть в подзапрос с выборкой фирма, дата, сотрудник и клеить ко второму cross join`ом с условием по фирме и дате. Кажется так... mssql под рукой нет ;(
Возможно left join подойдет лучше, но это зависит от того как и что тебе надо выводить...
З.Ы. Не понимаю зачем такой запрос Подмигивание
« Последняя редакция: 13. Декабря 2016 :: 18:57 - Djelf »  
Наверх
www  
IP записан
 
Mink Snopes
Junior Member
**
Отсутствует


bookkeeping considered
harmful

Сообщений: 30
Местоположение: Dombabwe
Зарегистрирован: 05. Ноября 2013
Re: помогите новичку с запросом
Ответ #8 - 14. Декабря 2016 :: 12:39
Печать  
Если версия mssql старше 2000, то попробуй так
Код (SQL)
Выбрать все
WITH
	Выхода(ДатаДокум, Фирма, Сотрудник) AS (
	SELECT DISTINCT
		NullIf(Cast(Left(Журнал.DATE_TIME_IDDOC, 8) AS datetime), '17530101')
		,Журнал.$ОбщийРеквизит.Фирма
		,$_ТабельСтроки.Сотрудник
	FROM _1SJOURN AS Журнал
		INNER JOIN $ДокументСтроки._Табель AS _ТабельСтроки ON Журнал.IDDOC = _ТабельСтроки.IDDOC
	WHERE ((Журнал.CLOSED & 1) = 1)
		AND (Журнал.$ОбщийРеквизит.Фирма IN (SELECT Val FROM #sqlВыбФирма))
		AND (Журнал.Date_Time_IDDoc BETWEEN :ДатаНачала AND :ДатаКонца~)
	)
	Возвраты (ДатаДокум, Фирма, Номенклатура, КолВо, Сумма) AS (
	SELECT
		NullIf(Cast(Left(Журнал.DATE_TIME_IDDOC, 8) AS datetime), '17530101')
		,Журнал.$ОбщийРеквизит.Фирма
		,$ВозвратОтПокупателяСтроки.Номенклатура
		,Sum($ВозвратОтПокупателяСтроки.Количество)*(-1)
		,Sum($ВозвратОтПокупателяСтроки.Сумма)*(-1)
		FROM _1SJOURN AS Журнал
			INNER JOIN $ДокументСтроки.ВозвратОтПокупателя AS ВозвратОтПокупателяСтроки ON Журнал.IDDOC = ВозвратОтПокупателяСтроки.IDDOC
	WHERE ((Журнал.CLOSED & 1) = 1)
		AND ($ВозвратОтПокупателяСтроки.Номенклатура IN (SELECT Val FROM #sqlВыбНоменклатура))
		AND (Журнал.$ОбщийРеквизит.Фирма IN (SELECT Val FROM #sqlВыбФирма))
		AND (Журнал.Date_Time_IDDoc BETWEEN :ДатаНачала AND :ДатаКонца~)
	GROUP BY
		Журнал.$ОбщийРеквизит.Фирма
		,Журнал.DATE_TIME_IDDOC
		,$ВозвратОтПокупателяСтроки.Номенклатура
	)
SELECT
	Выхода.Фирма [Фирма $Справочник.Фирмы],
	Выхода.ДатаДокум,
	Выхода.Сотрудник [Сотрудник $Справочник.ФизЛица],
	Возвраты.Номенклатура [Номенклатура $Справочник.Номенклатура],
	Возвраты.Сумма
FROM Возвраты
	LEFT JOIN Выхода
		ON Возвраты.Фирма = Выхода.Фирма AND Возвраты.ДатаДокум = Выхода.ДатаДокум 



ЗЫ. Проверять не на чем, возможны опечатки.
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать