Посоветуете с запросом

Anapurna
Дата: 29.02.2008 22:11:52
доброе времья суток
у меня такая задача
есть данные получение запросом
Pos	Year	Month	Faqt
13010 2006 1 159 947,00
13010 2006 2 475 194,00
13010 2006 3 806 098,00
13010 2006 4 1 194 949,00
13010 2006 5 1 603 885,00
13010 2006 6 2 065 641,00
13010 2006 7 2 501 160,00
13010 2006 8 2 927 933,00
13010 2006 9 3 806 078,00
13010 2006 10 4 623 203,00
13010 2006 11 5 481 285,00
13010 2006 12 6 332 881,00
13010 2007 1 834 290,00
13010 2007 2 1 665 000,00
13010 2007 3 2 559 629,00
13010 2007 4 3 523 254,00
13010 2007 5 4 505 041,00
13010 2007 6 5 850 668,00
13010 2007 7 7 088 827,00
13010 2007 8 8 413 243,00
13010 2007 9 9 752 092,00
13010 2007 10 11 399 975,00
13010 2007 11 13 108 513,00
13010 2007 12 15 114 580,00
13010 2008 1 2 039 561,00
13010 2008 2 3 523 254,00

для Pos<13000 Faqt являеться не нарастающим
а при PosЮ=13000 Faqt являеться нарастающим т.е. для получение значения Faqt чистого мечяца надо отнять от значения текушего месяца предедуший

из этой таблицы надо получить коефициенты роста значения Faqt продукта Pos=13010
т.е. для января сравнение 2007 г с 2006-ь дасть 5,216
для февралья (1 665 000,00-834 290,00)/(475 194,00-159 947,00)=2,645
и т д

помогите
mds_world
Дата: 29.02.2008 23:06:13
Для Pos>=13000 попробуйте так
SELECT a1.pos, a1.year, a1.month, (a1.faqt-a2.faqt)/(b1.faqt-b2.faqt) as kof
FROM Таблица AS a1, Таблица AS a2, Таблица AS b1, Таблица AS b2,
a1 inner join a2 on a1.year=a2.year and a1.month=a2.month+1,
b1 inner join b2 on b1.year=b2.year and b1.month=b2.month+1,
a1 inner join b1 on a1.year=b1.year+1 and a1.month=b1.month
Anapurna
Дата: 29.02.2008 23:24:26
всё понятьно но при таком подходе теряеться значение для январья
Anapurna
Дата: 29.02.2008 23:26:34
итог таков

Year	Month	kof
2007 2 2,63510834361628
2007 3 2,70359076952832
2007 4 2,47813429822734
2007 5 2,40083289316666
2007 6 2,91415162986512
2007 7 2,84295059457796
2007 8 3,10332659282569
2007 9 1,52463317561451
2007 10 2,01668410585896
2007 11 1,9911127374773
2007 12 2,35565573346986

не прлучилось значние для
2008 1
2008 2
mds_world
Дата: 01.03.2008 00:28:48
Да, это так. Но вы не задавали правила перехода через год и я подумал, что этого и не нужно.

Попробуйте такой вариант
SELECT a1.pos, a1.year, a1.month, first((a1.faqt-a2.faqt)/(b1.faqt-b2.faqt)) AS kof
FROM Таблица AS a1, Таблица AS a2, Таблица AS b1, Таблица AS b2,
a1 inner join a2 on datediff("m",dateserial(a2.year,a2.month,1),dateserial(a1.year,a1.month,1))=1,
b1 inner join b2 on datediff("m",dateserial(b2.year,b2.month,1),dateserial(b1.year,b1.month,1))=1,
a1 inner join b1 on a1.year=b1.year+1,
a2 inner join b2 on a2.year=b2.year+1
group by a1.pos, a1.year, a1.month
Anapurna
Дата: 01.03.2008 11:20:38
получилось так
Year	Month	kof
2007 2 2,63510834361628
2007 3 2,83786681554464
2007 4 3,05673011955705
2007 5 3,11434208731566
2007 6 4,26848471198774
2007 7 3,92758376764886
2007 8 4,20120096305437
2007 9 4,24698411087179
2007 10 5,22727575520148
2007 11 5,41968044105099
2007 12 6,36347689272221
2008 1 2,37788535281129

всё таки нет 2007/1 и не вивелось 2008/2
и сктати запрос выполнялось до 10 с

по моему лучше будеть если создать временную таблицу и заполним ее даннимы
так легче будеть
что вы скажете ?
BoNiM
Дата: 01.03.2008 13:43:50
Сохраненный запрос Z
SELECT T1.Pos, T1.Year, T1.Month, T1.Faqt+Nz(T2.Faqt*(T1.Month<>1),0) AS Pr 
FROM Tab AS T1 LEFT JOIN Tab AS T2 
ON (T1.Pos=T2.Pos) AND (DateSerial(T1.Year,T1.Month,1)=DateSerial(T2.Year,T2.Month+1,1))
WHERE (T1.Pos>=13000)
Результирующий запрос
SELECT Z1.Pos, Z1.Year, Z1.Month, Z1.Pr/Z2.Pr AS k 
FROM Z AS Z1 INNER JOIN Z AS Z2 
ON (Z1.Pos=Z2.Pos) AND (Z1.Month=Z2.Month) AND (Z1.Year=Z2.Year+1)
Anapurna
Дата: 01.03.2008 20:29:35
да получилось спасибо BoNiM

но вичисление производиться даволно медленно !!

Anapurna
по моему лучше будеть если создать временную таблицу и заполним ее даннимы
так легче будеть


что вы скажете ?
BoNiM
Дата: 01.03.2008 22:07:30
Anapurna
... что вы скажете ?
Экспериментируйте.

P.S. Прежде, чем принимать решение о временной таблице, посмотрите не занимает ли большую часть общего времени работа вашего исходного запроса. Если это так, то необходима оптимизация этого запроса.
BoNiM
Дата: 02.03.2008 06:20:21
Anapurna
вичисление производиться даволно медленно !!
Попробуйте в запросе Z заменить
(DateSerial(T1.Year,T1.Month,1)=DateSerial(T2.Year,T2.Month+1,1))
на
((T1.Year*12+T1.Month)=(T2.Year*12+T2.Month+1))
Может будет чуток быстрее.