Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / FoxPro, Visual FoxPro Новый топик    Ответить
 запрос с датой  [new]
rock-n-roll
Member

Откуда:
Сообщений: 155
Помогите тупому с запросом
Есть тейбл типа
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

заранее благодарен
13 авг 09, 18:06    [7535559]     Ответить | Цитировать Сообщить модератору
 Re: запрос с датой  [new]
tanglir
Member

Откуда:
Сообщений: 28966
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. дальше понятно :)
13 авг 09, 18:15    [7535627]     Ответить | Цитировать Сообщить модератору
 Re: запрос с датой  [new]
-=AlexiS=-
Member

Откуда: Одесса
Сообщений: 712
Хотите чтобы помогли - соблюдайте правила
обратите внимание на параграф
Правила
При написании сообщений с просьбой о составлении запроса - хорошим тоном считается предоставление скрипта на создание таблицы и заполнение ее тестовыми данными, а также ожидаемого результата выборки, если это не очевидно из вопроса.

И научитесь задавать вопросы
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
13 авг 09, 18:55    [7535770]     Ответить | Цитировать Сообщить модератору
 Re: запрос с датой  [new]
rock-n-roll
Member

Откуда:
Сообщений: 155
Извините . Тогда без лишних шифров. Schet-это абонент. Type=1 поверка счетчика воды при этом nach-показания счетчика на конкретную дату (date) . Type=2 это показанные абонентом кубы( kub) Нужно просто узнать показания счетчиков на текущий момент.

Словом временно реализовал так создал курсор со Schet
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
Естественно медленно помогите плизд
14 авг 09, 10:26    [7537488]     Ответить | Цитировать Сообщить модератору
 Re: запрос с датой  [new]
Tohan_ORA
Member

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


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


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
14 авг 09, 11:01    [7537735]     Ответить | Цитировать Сообщить модератору
 Re: запрос с датой  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7864
Не проверял как будет работать. Написал "с листа". Поэтому не уверен можно ли в запросе сразу вычесть из kubinmes значение kubinmes_2 или потребуется второй запрос

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)
14 авг 09, 11:10    [7537805]     Ответить | Цитировать Сообщить модератору
 Re: запрос с датой  [new]
Tohan_ORA
Member

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


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


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

В таком случае запрос отработает неправильно.
Для такого случая я может бы даже сделал так:
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
14 авг 09, 11:12    [7537818]     Ответить | Цитировать Сообщить модератору
 Re: запрос с датой  [new]
LUCIAN
Member

Откуда: Беларусь г.Лида
Сообщений: 192
rock-n-roll,

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
14 авг 09, 11:49    [7538226]     Ответить | Цитировать Сообщить модератору
 Re: запрос с датой  [new]
Tohan_ORA
Member

Откуда:
Сообщений: 148
Проверим для двух случаев:
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"))


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
14 авг 09, 13:29    [7539127]     Ответить | Цитировать Сообщить модератору
Все форумы / FoxPro, Visual FoxPro Ответить