powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / запрос с датой
9 сообщений из 9, страница 1 из 1
запрос с датой
    #36142744
rock-n-roll
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Помогите тупому с запросом
Есть тейбл типа
Schet.........type........nach.......kub............date
1111............1............10.......... ............01/01/2000
1111............2............ .......... 3 ............01/01/2007
1111............1............1............ ............01/01/2008
1111............2............ ............5............01/02/2008
1112............1............0............ ............01/01/2008
1112............2............ ............2............01/01/2009
1113............2............ ............3............01/01/2009

нужно сгруппировать по Schet nach при type=1 с самой поздней датой плюс сумма kub при type=2 и датой более поздней , а про отсутствии type=1 пуст будет скажем -1
т.е должно выглядеть так
1111............6
1112............2
1113............-1

заранее благодарен
...
Рейтинг: 0 / 0
запрос с датой
    #36142772
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rock-n-rollнужно сгруппировать по Schet nach при type=1 с самой поздней датой плюс сумма kub при type=2 и датой более поздней , а про отсутствии type=1 пуст будет скажем -1
crystal ball overhead, однако.
Нужно взять
1. (сумму/максимум/среднее?) от nach(или чего?) при type=1 (про дату вообще втупил) группируя по schet (и ещё чему-то?)
2. плюс сумма kub при type=2 и датой более поздней (чем что? - см.п.1)
3. дальше понятно :)
...
Рейтинг: 0 / 0
запрос с датой
    #36142855
-=AlexiS=-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотите чтобы помогли - соблюдайте правила
обратите внимание на параграф
ПравилаПри написании сообщений с просьбой о составлении запроса - хорошим тоном считается предоставление скрипта на создание таблицы и заполнение ее тестовыми данными, а также ожидаемого результата выборки, если это не очевидно из вопроса.
И научитесь задавать вопросы
rock-n-rollнужно сгруппировать по Schet nach при type=1 с самой поздней датой плюс сумма kub при type=2 и датой более поздней , а про отсутствии type=1 пуст будет скажем -1
Еще раз и по русски пожалуйста .

Я эту белиберду понял так
нужно для каждого Schet - получить :
1. nach для type=1 на максимальную дату
2. к числу из п.1 прибавить kub для type=2 насчет того на какую дату - тут не ясно то-ли на максимальную дату, то ли на дату ,следующую после даты из п.1
3. если для Schet нет записей с type=1 - то результат = "-1"

кстати еще неясно что делать если нет нет записей с type=2
...
Рейтинг: 0 / 0
запрос с датой
    #36143634
rock-n-roll
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Извините . Тогда без лишних шифров. Schet-это абонент. Type=1 поверка счетчика воды при этом nach-показания счетчика на конкретную дату (date) . Type=2 это показанные абонентом кубы( kub) Нужно просто узнать показания счетчиков на текущий момент.

Словом временно реализовал так создал курсор со Schet
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
sele somefile_rw
go top
do while !eof()

mschet=schet
sele * from sch_vod wher schet=mschet and filter_uch=dostup_t and type= 1  into curs nnnn
if reccount()= 0 
  repl pred with 'Ошибка' in somefile_rw
else
  go bottom
  mschet=schet
  nnn_date=date
  nn_npok=nachpok
  sele sum(kubinmes) as kubinmes from sch_vod wher schet=mschet and filter_uch=dostup_t  and type= 2  and  date>=nnn_date  into curs nnnn
  repl pred with str(nnnn.kubinmes+nn_npok, 10 , 3 ) in somefile_rw  
endi   
sele somefile_rw
skip
endd
use in nnnn
sele somefile_rw
Естественно медленно помогите плизд
...
Рейтинг: 0 / 0
запрос с датой
    #36143732
Tohan_ORA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
rock-n-rollИзвините . Тогда без лишних шифров. Schet-это абонент. Type=1 поверка счетчика воды при этом nach-показания счетчика на конкретную дату (date) . Type=2 это показанные абонентом кубы( kub) Нужно просто узнать показания счетчиков на текущий момент.

Если я правильно понял, то можно попробовать так,но без тестовых данных трудновато.
Все-таки я бы принял к сведению:
При написании сообщений с просьбой о составлении запроса - хорошим тоном считается предоставление скрипта на создание таблицы и заполнение ее тестовыми данными,

Код: plaintext
1.
2.
3.
4.
5.
select schet,;
nvl((select sum(nach) from mytab where type= 1  and schet=x.schet and date=dt1),- 1 )+;
(select sum(kub) from mytab where type= 2  and schet=x.schet and date=dt2);
from;
(select schet,max(iif(type= 1 ,date,null)) dt1,max(iif(type= 2 ,date,null)) dt2;
from mytab group by schet)x
Работать будет если для абонента всегда есть type=2 и оно по дате всегда позже type=1
...
Рейтинг: 0 / 0
запрос с датой
    #36143756
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не проверял как будет работать. Написал "с листа". Поэтому не уверен можно ли в запросе сразу вычесть из kubinmes значение kubinmes_2 или потребуется второй запрос

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
select ;
	t1.schet, ;
	t1.kubinmes, ;
	sum(cast(nvl(t3.kubinmes, 0 ) as int)) as kubinmes_2 ;
from sch_vod t1 ;
left join sch_vod t3 on t3.schet = t1.schet ;
			and t3.filter_uch = t1.filter_uch ;
			and t3.date >= t1.date ;
			and t3.type= 2 
where ;
	t1.type =  1  ;
	and t1.filter_uch = dostup_t ;
	and not exists(select 'x' ;
		from sch_vod t2 ;
		where t2.schet = t1.schet ;
			and t2.filter_uch = t1.filter_uch ;
			and t2.date > t1.date) ;
group by ;
	t1.schet, ;
	t1.kubinmes, ;

UNION ALL ;

select ;
	t4.schet, ;
	- 1  as kubinmes, ;
	 0  as kubinmes_2 ;
from sch_vod t4 ;
where not exists(select 'x' ;
		from sch_vod t5 ;
		where t5.schet = t4.schet ;
			and t5.filter_uch = t4.filter_uch ;
			and t5.type= 1 )
...
Рейтинг: 0 / 0
запрос с датой
    #36143762
Tohan_ORA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Tohan_ORA
rock-n-rollИзвините . Тогда без лишних шифров. Schet-это абонент. Type=1 поверка счетчика воды при этом nach-показания счетчика на конкретную дату (date) . Type=2 это показанные абонентом кубы( kub) Нужно просто узнать показания счетчиков на текущий момент.


Если я правильно понял, то можно попробовать так,но без тестовых данных трудновато.
Все-таки я бы принял к сведению:
При написании сообщений с просьбой о составлении запроса - хорошим тоном считается предоставление скрипта на создание таблицы и заполнение ее тестовыми данными,

Код: plaintext
1.
2.
3.
4.
5.
select schet,;
nvl((select sum(nach) from mytab where type= 1  and schet=x.schet and date=dt1),- 1 )+;
(select sum(kub) from mytab where type= 2  and schet=x.schet and date=dt2);
from;
(select schet,max(iif(type= 1 ,date,null)) dt1,max(iif(type= 2 ,date,null)) dt2;
from mytab group by schet)x
Работать будет если для абонента всегда есть type=2 и оно по дате всегда позже type=1
Нет все-таки давайте тестовые данные.
Вот допустим.что последней поверки не было, а снятие перед ним и поверка предшествующая ему были:
Schet.........type........nach.......kub............date
1111............1............10.......... ............01/01/2000
1111............2............ .......... 3 ............01/01/2007
1111............1............1............ ............01/01/2008
1111............2............ ............5............01/02/2008
1112............1............0............ ............01/01/2008
1112............2............ ............2............01/01/2009
1113............2............ ............3............01/01/2009

В таком случае запрос отработает неправильно.
Для такого случая я может бы даже сделал так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
select schet,;
nvl((select sum(nach) from mytab where type= 1  and schet=x.schet and date=dt1;
and not exists(select  1  from mytab where type= 2  and date>= dt1 and date<dt2);
),- 1 )+;
(select sum(kub) from mytab where type= 2  and schet=x.schet and date=dt2);
from;
(select schet,max(iif(type= 1 ,date,null)) dt1,max(iif(type= 2 ,date,null)) dt2;
from mytab group by schet)x
...
Рейтинг: 0 / 0
запрос с датой
    #36143913
LUCIAN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
rock-n-roll,

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
CREATE CURSOR sch_vod (Schet N( 4 ),type N( 1 ),nach N( 3 ),kub N( 3 ),date D( 8 ))
INSERT INTO sch_vod (Schet,type,nach,kub,date) VALUES ( 1111 , 1 , 10 , 0 ,CTOD("01/01/2000"))
INSERT INTO sch_vod (Schet,type,nach,kub,date) VALUES ( 1111 , 2 , 0 , 3 ,CTOD("01/01/2007"))
INSERT INTO sch_vod (Schet,type,nach,kub,date) VALUES ( 1111 , 1 , 1 , 0 ,CTOD("01/01/2008"))
INSERT INTO sch_vod (Schet,type,nach,kub,date) VALUES ( 1111 , 2 , 0 , 5 ,CTOD("01/02/2008"))
INSERT INTO sch_vod (Schet,type,nach,kub,date) VALUES ( 1112 , 1 , 0 , 0 ,CTOD("01/01/2008"))
INSERT INTO sch_vod (Schet,type,nach,kub,date) VALUES ( 1112 , 2 , 0 , 2 ,CTOD("01/01/2009"))
INSERT INTO sch_vod (Schet,type,nach,kub,date) VALUES ( 1113 , 2 , 0 , 3 ,CTOD("01/01/2009"))
SELECT Schet,nach OB FROM sch_vod NACH WHERE TYPE= 1  AND ;
DATE IN (SELECT MAX(DATE) FROM sch_vod WHERE Schet=NACH.SCHET AND TYPE= 1  GROUP BY SCHET) INTO CURSOR C1
SELECT KUB.Schet,IIF(ISNULL(C1.Schet),- 1 ,C1.OB+KUB.KUB) OB FROM sch_vod  KUB LEFT OUTER JOIN C1 ;
ON C1.Schet=KUB.Schet WHERE TYPE= 2  AND ;
KUB.DATE IN (SELECT MAX(DATE) FROM sch_vod WHERE Schet=KUB.SCHET AND TYPE= 2  GROUP BY SCHET) ;
INTO CURSOR C2
...
Рейтинг: 0 / 0
запрос с датой
    #36144321
Tohan_ORA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Проверим для двух случаев:
1:
CREATE CURSOR sch_vod (Schet N(4),type N(1),nach N(3),kub N(3),date D(8))
INSERT INTO sch_vod (Schet,type,nach,kub,date) VALUES (1111,1,10,0,CTOD("01/01/2000"))
INSERT INTO sch_vod (Schet,type,nach,kub,date) VALUES (1111,2,0,3,CTOD("01/01/2007"))
INSERT INTO sch_vod (Schet,type,nach,kub,date) VALUES (1111,1,1,0,CTOD("01/01/2008"))
INSERT INTO sch_vod (Schet,type,nach,kub,date) VALUES (1111,2,0,5,CTOD("01/02/2008"))
INSERT INTO sch_vod (Schet,type,nach,kub,date) VALUES (1112,1,0,0,CTOD("01/01/2008"))
INSERT INTO sch_vod (Schet,type,nach,kub,date) VALUES (1112,2,0,2,CTOD("01/01/2009"))
INSERT INTO sch_vod (Schet,type,nach,kub,date) VALUES (1113,2,0,3,CTOD("01/01/2009"))

2:
Проверим для двух случаев:
CREATE CURSOR sch_vod (Schet N(4),type N(1),nach N(3),kub N(3),date D(8))
INSERT INTO sch_vod (Schet,type,nach,kub,date) VALUES (1111,1,10,0,CTOD("01/01/2000"))
INSERT INTO sch_vod (Schet,type,nach,kub,date) VALUES (1111,2,0,3,CTOD("01/01/2007"))
INSERT INTO sch_vod (Schet,type,nach,kub,date) VALUES (1111,1,1,0,CTOD("01/01/2008"))
INSERT INTO sch_vod (Schet,type,nach,kub,date) VALUES (1111,2,0,5,CTOD("01/02/2008"))
INSERT INTO sch_vod (Schet,type,nach,kub,date) VALUES (1112,1,0,0,CTOD("01/01/2008"))
INSERT INTO sch_vod (Schet,type,nach,kub,date) VALUES (1112,2,0,2,CTOD("01/01/2009"))
INSERT INTO sch_vod (Schet,type,nach,kub,date) VALUES (1113,2,0,3,CTOD("01/01/2009"))


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
select schet,;
NVL((select sum(nach) from sch_vod where type= 1  and schet=y.schet and date=dt1), 0 )+;
IIF(!EMPTY(dt1),(select sum(kub) from sch_vod where type= 2  and schet=y.schet and date=dt2),- 1 ) result from;
(select schet,;
IIF(ISNULL((select MAX( 1 ) FROM sch_vod WHERE type= 2  AND schet=x.schet AND date >=dt1 AND date<dt2)),dt1,{})dt1,dt2;
from;
(select schet,max(iif(type= 1 ,date,{})) dt1,max(iif(type= 2 ,date,{})) dt2;
from sch_vod group by schet)x)y
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / запрос с датой
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]