Переключение на Главную Страницу Страницы: [1] 2 3  ОтправитьПечать
Очень популярная тема (более 25 ответов) Как сделать аналог Все по группировке "День"? (число прочтений - 15004 )
pvase
God Member
*****
Отсутствует



Сообщений: 923
Местоположение: Киев
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Как сделать аналог Все по группировке "День"?
27. Октября 2006 :: 08:21
Печать  
Пишу такой запрос:
Код
Выбрать все
|SELECT
	|    Рег.Клиент as [Клиент $Справочник.Клиенты],
	|    Рег.Период AS Период,
	|    Рег.СуммаГРННачальныйОстаток as СуммаГРННачальныйОстаток,
	|    Рег.СуммаГРНПриход as СуммаГРНПриход,
	|    Рег.СуммаГРНРасход as СуммаГРНРасход,
	|    Рег.СуммаГРНКонечныйОстаток as СуммаГРНКонечныйОстаток
	|FROM
	|    $РегистрОстаткиОбороты.Взаиморасчеты(:НачДата, :КонДата~, День, ДвиженияИГраницыПериода,
	|										 ,,
	|										(Клиент), (СуммаГРН)) as Рег
 


Как заставить такой код получать в качестве Период не только даты, по которым были движения (есть записи в RA), а все даты за период?
Напрямую в SQL это делается так:
Код
Выбрать все
SELECT
	TMP.Клиент AS Клиент,
	TMP.День AS День,
	SUM(TMP.Приход) AS Приход,
	SUM(TMP.Рассход) AS Рассход
INTO #Tab_obor
FROM
(
	SELECT
		TabR2.SP1061 AS Клиент,
		CAST(LEFT(TabJ.DATE_TIME_IDDOC,8) AS DateTime) AS День,
		SUM(TabR2.SP7593*((TabR2.DEBKRED+1)%2)) AS Приход,
		SUM(TabR2.SP7593*TabR2.DEBKRED) AS Рассход
	FROM
		RA1060 AS TabR2 (NOLOCK)
	INNER JOIN _1SJOURN As TabJ (NOLOCK) ON (TabR2.IDDOC = TabJ.IDDOC)
	WHERE
		TabJ.DATE_TIME_IDDOC >= '20060901'
		AND TabJ.DATE_TIME_IDDOC < '20060901Z'
	GROUP BY
		TabR2.SP1061,
		CAST(LEFT(TabJ.DATE_TIME_IDDOC,8) AS DateTime)

	UNION ALL
	SELECT
		DISTINCT tmp_t.Клиент  AS Клиент,
		TabPer.PeriodDate,
		0,
		0
	FROM #PeriodTMP AS TabPer, #TMP_obor AS tmp_t
) AS TMP
GROUP BY
	TMP.Клиент,
	TMP.День
 


Но как теперь в виртуальную таблицу вставить необходимый мне код?
Или по другому, как заменить ту виртуальную таблицу, которую формирует 1С++ на ту, которая нужна для получения желаемого результата?
  
Наверх
IP записан
 
Славко
Senior Member
****
Отсутствует



Сообщений: 467
Местоположение: Украина, г. Днепропетровск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как сделать аналог Все по группировке "День"?
Ответ #1 - 27. Октября 2006 :: 08:32
Печать  
Вась, я понимаю твое состояние, но ты бы успокоился, попробовал бы вопспользоваться поиском по этому ресурсу, эта тема тут обсасывалась неоднократно...
не найдешь, помогу тебе поисковиком воспользоваться...
  

Ламер, самый обычный ламер...    сначала мы ...   а потом мы ...
Наверх
wwwICQ  
IP записан
 
pvase
God Member
*****
Отсутствует



Сообщений: 923
Местоположение: Киев
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как сделать аналог Все по группировке "День"?
Ответ #2 - 27. Октября 2006 :: 09:05
Печать  
Цитата:
Вась, я понимаю твое состояние, но ты бы успокоился, попробовал бы вопспользоваться поиском по этому ресурсу, эта тема тут обсасывалась неоднократно...
не найдешь, помогу тебе поисковиком воспользоваться...

Какие параметры поиска?
Буду признателен за ссылку на ветку.
  
Наверх
IP записан
 
Славко
Senior Member
****
Отсутствует



Сообщений: 467
Местоположение: Украина, г. Днепропетровск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как сделать аналог Все по группировке "День"?
Ответ #3 - 27. Октября 2006 :: 09:34
Печать  
pvase писал(а) 27. Октября 2006 :: 09:05:
Какие параметры поиска?

ну как минимум $РегистрОстаткиОбороты

pvase писал(а) 27. Октября 2006 :: 09:05:
Буду признателен за ссылку на ветку.

думаю стоит почитать:
http://www.1cpp.ru/forum/YaBB.pl?num=1158643277/0#0
http://www.1cpp.ru/forum/YaBB.pl?num=1157379745/0#0
и аналогичные ветки... а вообще очень сильно помогает дока, в твоем случае нада с доки начинать... причем по SQL...
  

Ламер, самый обычный ламер...    сначала мы ...   а потом мы ...
Наверх
wwwICQ  
IP записан
 
pvase
God Member
*****
Отсутствует



Сообщений: 923
Местоположение: Киев
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как сделать аналог Все по группировке "День"?
Ответ #4 - 27. Октября 2006 :: 09:39
Печать  
Цитата:
и аналогичные ветки... а вообще очень сильно помогает дока, в твоем случае нада с доки начинать... причем по SQL...

Сенкс.
По поводу доки - что может быть, скажем в Мамаеве или Хендерсоне, чего не подскажут на sql.ru, а там я уже все прошерстил по поводу получения итогов с накоплением.
  
Наверх
IP записан
 
Славко
Senior Member
****
Отсутствует



Сообщений: 467
Местоположение: Украина, г. Днепропетровск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как сделать аналог Все по группировке "День"?
Ответ #5 - 27. Октября 2006 :: 09:42
Печать  
pvase писал(а) 27. Октября 2006 :: 09:39:
По поводу доки - что может быть, скажем в Мамаеве или Хендерсоне, чего не подскажут на sql.ru, а там я уже все прошерстил по поводу получения итогов с накоплением.

Вась, ни в одной доке не рекомендуют делать группировку по полю, по которому нет индекса, в то время, когда есть связанное с ним поле, по которому есть индекс, а тем более уникальных... на основании какой доки ды фиганул группировку по полю, по которому нет индекса?
  

Ламер, самый обычный ламер...    сначала мы ...   а потом мы ...
Наверх
wwwICQ  
IP записан
 
pvase
God Member
*****
Отсутствует



Сообщений: 923
Местоположение: Киев
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как сделать аналог Все по группировке "День"?
Ответ #6 - 27. Октября 2006 :: 10:23
Печать  
Цитата:
pvase писал(а) 27. Октября 2006 :: 09:39:
По поводу доки - что может быть, скажем в Мамаеве или Хендерсоне, чего не подскажут на sql.ru, а там я уже все прошерстил по поводу получения итогов с накоплением.

Вась, ни в одной доке не рекомендуют делать группировку по полю, по которому нет индекса, в то время, когда есть связанное с ним поле, по которому есть индекс, а тем более уникальных... на основании какой доки ды фиганул группировку по полю, по которому нет индекса?

Т.е. если вместо временных таблиц использовать подзапросы до RA и их обрабатывать - будет на порядок быстрее?
Теперь по поводу индексов - ни в одной литературе не рекомендуют ставить индексы (тем более кластерные) на записи, которые часто удаляются и вставляются (система OLTP), разве что если затраты на вставку записей с такими индексами меньше затрат на получение записей в запросе. Но кроме времени есть еще параметр объем базы, который для систем OLTP также есть существенным, особенно если речь идет о вводе и удалении записей, которые уже были в таблице.

На счет индексов - вчера как раз над этим подумал, но сновая же кластерным индексом это быть не может, так как тогда индекс должен быть составной, причем в порядке проставления условий в WHERE.

ЗЫ
Но причем тут 1С++ и виртуальная таблица?
ЗЫ2
А где в доке описано что 1С++ поддерживает параметры "Все" и "Все вошедшие в запрос"?
  
Наверх
IP записан
 
Славко
Senior Member
****
Отсутствует



Сообщений: 467
Местоположение: Украина, г. Днепропетровск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как сделать аналог Все по группировке "День"?
Ответ #7 - 27. Октября 2006 :: 10:55
Печать  
5-й ответ был по опводу твоей статьи...
а речь об индексах не о твоей временной таблице, а том как ты строишь запрос к существующим таблицам...
  

Ламер, самый обычный ламер...    сначала мы ...   а потом мы ...
Наверх
wwwICQ  
IP записан
 
pvase
God Member
*****
Отсутствует



Сообщений: 923
Местоположение: Киев
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как сделать аналог Все по группировке "День"?
Ответ #8 - 27. Октября 2006 :: 11:13
Печать  
Цитата:
5-й ответ был по опводу твоей статьи...
а речь об индексах не о твоей временной таблице, а том как ты строишь запрос к существующим таблицам...

Запросы к существующим таблицам выполняются за 2-3 секунды (ну можно указать ), а вот потом пересчет данных во временной - вот где затык (до 5-9 минут может длится). Но в 1С++ - эта проблема решена тем, что пересчет происходит на C++ в ОЗУ, а не возложен на SQL, но в 1С++ - пока не могу понять как его заставить сделать обьединение с таблицей где есть все даты и клиенты.
ЗЫ
Кстати добавление кластерного составного индекса (состоящего из всех группировок) для временных таблиц уменьшило время выполнения в 2 раза и снизило нагрузку на CPU на 20%.
  
Наверх
IP записан
 
Славко
Senior Member
****
Отсутствует



Сообщений: 467
Местоположение: Украина, г. Днепропетровск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как сделать аналог Все по группировке "День"?
Ответ #9 - 27. Октября 2006 :: 11:34
Печать  
Вася, сколько раз тебе объяснять, что 1С++ - это чистый T-SQL, за исключением того, что у него есть свой метапарсер, который облегчает тебе работу с объектами 1С???
  

Ламер, самый обычный ламер...    сначала мы ...   а потом мы ...
Наверх
wwwICQ  
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как сделать аналог Все по группировке "День"?
Ответ #10 - 27. Октября 2006 :: 11:41
Печать  
pvase писал(а) 27. Октября 2006 :: 08:21:
Пишу такой запрос:
Код
Выбрать все
|SELECT
|    Рег.Клиент as [Клиент $Справочник.Клиенты],
|    Рег.Период AS Период,
|    Рег.СуммаГРННачальныйОстаток as СуммаГРННачальныйОстаток,
|    Рег.СуммаГРНПриход as СуммаГРНПриход,
|    Рег.СуммаГРНРасход as СуммаГРНРасход,
|    Рег.СуммаГРНКонечныйОстаток as СуммаГРНКонечныйОстаток
|FROM
|    $РегистрОстаткиОбороты.Взаиморасчеты(:НачДата, :КонДата~, День, ДвиженияИГраницыПериода,,,
|	(Клиент), (СуммаГРН)) as Рег
 


Как заставить такой код получать в качестве Период не только даты, по которым были движения (есть записи в RA), а все даты за период?

Код
Выбрать все
FROM (SELECT Дата, Клиент
	FROM Даты CROSS JOIN Клиенты) ДатыКлиенты LEFT OUTER JOIN $ВТ... 

  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
Славко
Senior Member
****
Отсутствует



Сообщений: 467
Местоположение: Украина, г. Днепропетровск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как сделать аналог Все по группировке "День"?
Ответ #11 - 27. Октября 2006 :: 11:48
Печать  
а может все таки
Код
Выбрать все
select TabDate.MyDate, TabOst. ...
from TabDate
left outer join $VT...  as TabOst ON TabData.MyDate=TabOst.Date 

  

Ламер, самый обычный ламер...    сначала мы ...   а потом мы ...
Наверх
wwwICQ  
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как сделать аналог Все по группировке "День"?
Ответ #12 - 27. Октября 2006 :: 11:55
Печать  
Цитата:
а может все таки
Код
Выбрать все
select TabDate.MyDate, TabOst. ...
from TabDate
left outer join $VT...  as TabOst ON TabData.MyDate=TabOst.Date 


Так будут даты без клиентов. Это не подойдёт для разворота клиентов по датам.
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
Славко
Senior Member
****
Отсутствует



Сообщений: 467
Местоположение: Украина, г. Днепропетровск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как сделать аналог Все по группировке "День"?
Ответ #13 - 27. Октября 2006 :: 11:57
Печать  
berezdetsky писал(а) 27. Октября 2006 :: 11:55:
Так будут даты без клиентов. Это не подойдёт для разворота клиентов по датам.

ты точно в этом уверен?
  

Ламер, самый обычный ламер...    сначала мы ...   а потом мы ...
Наверх
wwwICQ  
IP записан
 
Славко
Senior Member
****
Отсутствует



Сообщений: 467
Местоположение: Украина, г. Днепропетровск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как сделать аналог Все по группировке "День"?
Ответ #14 - 27. Октября 2006 :: 12:00
Печать  
хотя у тебя тоже что и у меня, только ты джионишь по клиентам, привязав клиентов к датам, все таки думаю что мой вариант оптимальнее... у тебя просто идет лишний кросс...
  

Ламер, самый обычный ламер...    сначала мы ...   а потом мы ...
Наверх
wwwICQ  
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 3 
ОтправитьПечать