Переключение на Главную Страницу Страницы: [1] 2  ОтправитьПечать
Горячая тема (более 10 ответов) Требуется помощь с подзапросом (число прочтений - 4170 )
КилоГрамм
Senior Member
****
Отсутствует


Таити, Таити...

Сообщений: 434
Зарегистрирован: 14. Июня 2006
Пол: Мужской
Требуется помощь с подзапросом
10. Июля 2008 :: 08:01
Печать  
Нужно получить список последних документов на общую сумму долга каждого из долников. Есть кривой запрос:
Код
Выбрать все
	|SELECT
	|   Долги.Клиент	  as [Клиент $Справочник.Клиенты],
	|   Отгрузки.Док	  as [Док    $Документ.Расходная],
	|   Отгрузки.ДатаВремя  as ДатаВремя,
	|   MAX(Долги.Дебет)    as Дебет,
	|   SUM(Отгрузки.Сумма) as Отгрузка
	|FROM (
	|	SELECT
	| 	  Рег.Клиент  as Клиент,
	|		SUM(-Рег.СуммаОстаток) as Дебет
	|	FROM
	| 	  $РегистрОстатки.Деньги(:НачДата~,,,
	|				 (Клиент),(Сумма)) as Рег
	|	GROUP BY
	| 	  Рег.Клиент
	|	HAVING
	|		SUM(Рег.СуммаОстаток) < 0
	|	) as Долги
	|LEFT JOIN (
	|	SELECT TOP 100
	|		  $Накл.Клиент as Клиент,
	|		  Жур.IDDoc    as Док,
	|		  Жур.Date_Time_IDDoc ДатаВремя,
	|		  SUM($Мнч.Всего)   as Сумма
	|	FROM
	| 	  _1SJourn as Жур
	|	INNER JOIN
	| 	  $Документ.Расходная as Накл ON Накл.IDDoc = Жур.IDDoc
	|	INNER JOIN
	| 	  $ДокументСтроки.Расходная as Мнч ON Мнч.IDDoc = Накл.IDDoc
	|	WHERE
	| 	  Жур.Date_Time_IDDoc <= :НольДата AND
	| 	  Жур.IDDocDef = $ВидДокумента.Расходная
	|	GROUP BY
	|		  $Накл.Клиент,Жур.IDDoc,Жур.Date_Time_IDDoc
	|	ORDER BY
	|		Жур.Date_Time_IDDoc desc
	|) as Отгрузки ON Отгрузки.Клиент = Долги.Клиент
	|GROUP BY
	|   Долги.Клиент,Отгрузки.Док,Отгрузки.ДатаВремя
	|ORDER BY
	|   Долги.Клиент,Отгрузки.ДатаВремя
 


1. В этом запросе нет условия по сумме - выборка по клиенту должна прекращаться при общей сумме расходных, превышающей (равной) сумме долга.
2. "SELECT TOP 100" конечно неправильно, но если TOP убрать, запрос не может отсортировать по дате_времени документы. 100 - мало, а как определить, сколько?
Помогите пожалуйста.
  

Константин
Наверх
 
IP записан
 
КилоГрамм
Senior Member
****
Отсутствует


Таити, Таити...

Сообщений: 434
Зарегистрирован: 14. Июня 2006
Пол: Мужской
Re: Требуется помощь с подзапросом
Ответ #1 - 10. Июля 2008 :: 11:09
Печать  
Хорошо, давайте упростим задачу.Есть запрос:
Код
Выбрать все
	|	SELECT
	|		  RIGHT(Жур.Date_Time_IDDoc,9)  as [Накладная $Документ.Расходная],
	|		  SUM($Мнч.Всего) as Сумма
	|	FROM
	| 	  _1SJourn as Жур
	|	INNER JOIN
	| 	  $Документ.Расходная as Накл ON Накл.IDDoc = Жур.IDDoc AND $Накл.Клиент = :ВыбКлиент
	|	INNER JOIN
	| 	  $ДокументСтроки.Расходная as Мнч ON Мнч.IDDoc = Накл.IDDoc
	|	WHERE
	| 	  Жур.Date_Time_IDDoc <= :НольДата AND
	| 	  Жур.IDDocDef = $ВидДокумента.Расходная
	|	GROUP BY
	|		Жур.Date_Time_IDDoc
	|	ORDER BY
	|		Жур.Date_Time_IDDoc desc
 

Как поставить условие на то, чтоб общая сумма документов не превышала например 10000
  

Константин
Наверх
 
IP записан
 
U_zer
Экс-Участник


Re: Требуется помощь с подзапросом
Ответ #2 - 10. Июля 2008 :: 11:13
Печать  
По идее, если выставить галочку - итог по колонке, можно делать запрос по шапке дока. Намек понят?   Класс
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Требуется помощь с подзапросом
Ответ #3 - 10. Июля 2008 :: 11:20
Печать  
Цитата:
Как поставить условие на то, чтоб общая сумма документов не превышала например 10000


Код
Выбрать все
GROUP BY
	|		Жур.Date_Time_IDDoc HAVING SUM($Мнч.Всего)<=10000 


?
  
Наверх
 
IP записан
 
КилоГрамм
Senior Member
****
Отсутствует


Таити, Таити...

Сообщений: 434
Зарегистрирован: 14. Июня 2006
Пол: Мужской
Re: Требуется помощь с подзапросом
Ответ #4 - 10. Июля 2008 :: 11:24
Печать  
Цитата:
Намек понят?
Нет, я тупой. Причем тут шапка документа и какая галочка ?
  

Константин
Наверх
 
IP записан
 
КилоГрамм
Senior Member
****
Отсутствует


Таити, Таити...

Сообщений: 434
Зарегистрирован: 14. Июня 2006
Пол: Мужской
Re: Требуется помощь с подзапросом
Ответ #5 - 10. Июля 2008 :: 11:28
Печать  
JohnyDeath писал(а) 10. Июля 2008 :: 11:20:
Цитата:
Как поставить условие на то, чтоб общая сумма документов не превышала например 10000


Код
Выбрать все
GROUP BY
	|		Жур.Date_Time_IDDoc HAVING SUM($Мнч.Всего)<=10000 


?
При ьакой выборке он выдает ВСЕ документы, сумма у которых меньше=100000, а мне нужно набрать документов на ОБЩУЮ сумму 100000
  

Константин
Наверх
 
IP записан
 
Вадимко
God Member
*****
Отсутствует


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

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Требуется помощь с подзапросом
Ответ #6 - 10. Июля 2008 :: 11:29
Печать  
Странный запрос какой-то...
Неужели в регистре нет документа по которому долг висит?
Иначе как пальцем в небо
И не забывай про частично закрытые доки
  

Кампутер, кофе и сигареты - это очень плохо для моего здоровья...
Наверх
IP записан
 
КилоГрамм
Senior Member
****
Отсутствует


Таити, Таити...

Сообщений: 434
Зарегистрирован: 14. Июня 2006
Пол: Мужской
Re: Требуется помощь с подзапросом
Ответ #7 - 10. Июля 2008 :: 11:30
Печать  
Цитата:
Неужели в регистре нет документа по которому долг висит?
То-то и оно, что нет.
  

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



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Требуется помощь с подзапросом
Ответ #8 - 10. Июля 2008 :: 11:32
Печать  
Цитата:
JohnyDeath писал(а) 10. Июля 2008 :: 11:20:
Цитата:
Как поставить условие на то, чтоб общая сумма документов не превышала например 10000


Код
Выбрать все
GROUP BY
	|		Жур.Date_Time_IDDoc HAVING SUM($Мнч.Всего)<=10000 


?
При ьакой выборке он выдает ВСЕ документы, сумма у которых меньше=100000, а мне нужно набрать документов на ОБЩУЮ сумму 100000

ааа, т.е. тебе надо ПОСЛЕДОВАТЕЛЬНО набирать документы до той поры, пока не наступит пик, равный 10000?
и Вадимко, по-моему, прав.
  
Наверх
 
IP записан
 
Вадимко
God Member
*****
Отсутствует


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

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Требуется помощь с подзапросом
Ответ #9 - 10. Июля 2008 :: 11:33
Печать  
Цитата:
Цитата:
Неужели в регистре нет документа по которому долг висит?
То-то и оно, что нет.

Я бы честно говоря сделал курсором (ибо иначе запутаюсь)
Гуру бы сделал запросом Улыбка
  

Кампутер, кофе и сигареты - это очень плохо для моего здоровья...
Наверх
IP записан
 
КилоГрамм
Senior Member
****
Отсутствует


Таити, Таити...

Сообщений: 434
Зарегистрирован: 14. Июня 2006
Пол: Мужской
Re: Требуется помощь с подзапросом
Ответ #10 - 10. Июля 2008 :: 11:38
Печать  
Цитата:
ааа, т.е. тебе надо ПОСЛЕДОВАТЕЛЬНО набирать документы до той поры, пока не наступит пик, равный 10000? .
Да.
  

Константин
Наверх
 
IP записан
 
КилоГрамм
Senior Member
****
Отсутствует


Таити, Таити...

Сообщений: 434
Зарегистрирован: 14. Июня 2006
Пол: Мужской
Re: Требуется помощь с подзапросом
Ответ #11 - 10. Июля 2008 :: 11:40
Печать  
Цитата:
Я бы честно говоря сделал курсором (ибо иначе запутаюсь)
Нужно зделать отчет. Конфигурация не моя, да еще под УРИБДом.
  

Константин
Наверх
 
IP записан
 
КилоГрамм
Senior Member
****
Отсутствует


Таити, Таити...

Сообщений: 434
Зарегистрирован: 14. Июня 2006
Пол: Мужской
Re: Требуется помощь с подзапросом
Ответ #12 - 11. Июля 2008 :: 05:29
Печать  
Еще раз попробую сформулировать задачу, может кто откликнетмя:
1. Получить в запросе нарастающий итог.
2. При достижении нарастающего итога установленного предела выборку прервать.
На 1С все просто:
Код
Выбрать все
	Предел = 100000;
	Итог = 0;
	Док = СоздатьОбъект("Документ.Расходная");
	Док.ОбратныйПорядок(1);
	Док.ВыбратьПоЗначению(НачДата,КонДата,"Клиент",ВыбКлиент);
	Пока Док.ПолучитьДокумент() = 1 Цикл
		Итог = Итог + Док.Итог("Всего");
		Если Итог >= Предел
		Тогда
		    Прервать;
		КонецЕсли;
	КонецЦикла;
 

  

Константин
Наверх
 
IP записан
 
leshik
1c++ donor
Отсутствует



Сообщений: 820
Местоположение: Пятигорск
Зарегистрирован: 22. Апреля 2007
Пол: Мужской
Re: Требуется помощь с подзапросом
Ответ #13 - 11. Июля 2008 :: 05:50
Печать  
Ну так Вадимко вроде подсказал:
Код
Выбрать все
Я бы честно говоря сделал курсором (ибо иначе запутаюсь)  

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



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: Требуется помощь с подзапросом
Ответ #14 - 11. Июля 2008 :: 06:13
Печать  
Ну как враиант посчитать нарастающим итогом:
http://www.sql.ru/faq/faq_topic.aspx?fid=125

А вторым запросом ограничить выборку
??

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