powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / История изменений
14 сообщений из 14, страница 1 из 1
История изменений
    #35813380
как бы с помощью запросов выбрать все пары изменений?
Например, есть таблица изменений цен вида
Дата1 Товар Цена1
Дата2 Товар Цена2
Дата3 Товар Цена3

надо получить таблицу со старыми и новыми значениями цен такого вида
Дата2 Товар Цена1 Цена2
Дата3 Товар Цена2 Цена3
...
Рейтинг: 0 / 0
История изменений
    #35813929
-=AlexiS=-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Примерно так
Код: plaintext
1.
2.
3.
4.
SELECT t1.tovar ,t1.date,t2.date, t2.cena,t1.cena ;
from ( SELECT tovar ,date,MAX(cena) as cena,(SELECT MAX(date) date from table1 t3 where  t3.tovar=table1.tovar AND t3.date<table1.date ) as d2 FROM table1 GROUP BY tovar,date) t1 ;
     left join ( SELECT tovar,date,MAX(cena) as cena FROM table1 t  group BY t.tovar,t.date) t2    on t2.tovar= t1.tovar and t2.date = t1.d2 ;
ORDER BY  1 , 2 
...
Рейтинг: 0 / 0
История изменений
    #35814075
Спасибо, Алексис!
Работает. Но признаюсь честно, я ни**я не понял как. Смутили агрегатные функции MAX() по цене (с остальным всё понятно), т.к. цена может измениться и в меньшую сторону. Поигравшись с изменениями цен в большую и меньшую, убедился, что действительно работает.
...
Рейтинг: 0 / 0
История изменений
    #35814363
-=AlexiS=-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MAX- тут нужен если на одну дату несколько цен . Тут можно уже играться какую брать - максимальную, минимальную или среднюю
Если на дату цена одна все MAX можно убрать

Выполни по частям - станет понятнее

тут главное получить цепочку дат , т.е. текущую - предыдущая
этим занимаеться этот кусок
Код: plaintext
1.
SELECT tovar ,date,MAX(cena) as cena,(SELECT MAX(date) date from table1 t3 where  t3.tovar=table1.tovar AND t3.date<table1.date ) as d2 FROM table1 GROUP BY tovar,date

выбором предыдущей даты занимаеться подзапрос
Код: plaintext
SELECT MAX(date) date from table1 t3 where  t3.tovar=table1.tovar AND t3.date<table1.date

тут по товару и предыдущей дате находим собственно цену по товару на дату
Код: plaintext
1.
     left join ( SELECT tovar,date,MAX(cena) as cena FROM table1 t  group BY t.tovar,t.date) t2    on t2.tovar= t1.tovar and t2.date = t1.d2 ;


Обрати внимание на Left Join . Конечно поменяв на Inner мы избавимся от записей с NULL в "старой цене" но тогда потеряем товары имеющие только одну цену.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
История изменений
    #37740990
vorvv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
КонецЦиклакак бы с помощью запросов выбрать все пары изменений?
Например, есть таблица изменений цен вида
Дата1 Товар Цена1
Дата2 Товар Цена2
Дата3 Товар Цена3

надо получить таблицу со старыми и новыми значениями цен такого вида
Дата2 Товар Цена1 Цена2
Дата3 Товар Цена2 Цена3


У меня подобный вопрос

как выбрать цену на определенную дату - заранее известна
код IDTOVAR из таблички товаров соответствует
кодам ТОВАР1 ... из таблички истории цены

Табличка истории цены
ДАТА1 ТОВАР1 ЦЕНА1
ДАТА2 ТОВАР1 ЦЕНА2
ДАТА3 ТОВАР1 ЦЕНА3
ДАТА1 ТОВАР2 ЦЕНА1
ДАТА2 ТОВАР2 ЦЕНА2
ДАТА1 ТОВАР3 ЦЕНА1
ДАТА1 ТОВАР4 ЦЕНА1
ДАТА2 ТОВАР4 ЦЕНА2
...
Рейтинг: 0 / 0
История изменений
    #37741025
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vorvv,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
ldDate = date()

create cursor price (itemid i, date d, cost n(12,2))

insert into price values (1, ldDate - 20, 100) 
insert into price values (1, ldDate - 10, 120) 
insert into price values (1, ldDate - 0, 130) 
insert into price values (1, ldDate + 10, 140) 
insert into price values (2, ldDate - 20, 200) 
insert into price values (2, ldDate - 10, 220) 
insert into price values (2, ldDate - 0, 230) 
insert into price values (2, ldDate + 10, 240) 

ldDate = date() + -11

select a.itemid, a.date, a.cost ;
from price as a  ;
where a.date = ;
	(select max(b.date) from price as b where b.itemid = a.itemid and b.date <= ldDate)
...
Рейтинг: 0 / 0
История изменений
    #37741382
vorvv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Анатолий Широковvorvv,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
ldDate = date()

create cursor price (itemid i, date d, cost n(12,2))

insert into price values (1, ldDate - 20, 100) 
insert into price values (1, ldDate - 10, 120) 
insert into price values (1, ldDate - 0, 130) 
insert into price values (1, ldDate + 10, 140) 
insert into price values (2, ldDate - 20, 200) 
insert into price values (2, ldDate - 10, 220) 
insert into price values (2, ldDate - 0, 230) 
insert into price values (2, ldDate + 10, 240) 

ldDate = date() + -11

select a.itemid, a.date, a.cost ;
from price as a  ;
where a.date = ;
	(select max(b.date) from price as b where b.itemid = a.itemid and b.date <= ldDate)




Не вижу связи с табличкой товаров
Может я не правильно изложил вопрос

Необходимо создать запрос
который из таблицы товаров берет все записи
а из таблички истории берет цену для всех товаров !!!
на указанную дату

структура таблиц
товары
IDTOVAR IDNAME и тд
истории цены
HDATES IDTOVAR TCENA

Следует зметить что, в истории
ведется дата не за каждый день!!!
Буду очень благодарен!!!
...
Рейтинг: 0 / 0
История изменений
    #37741386
vorvv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SELECT t1.tovar ,t1.date,t2.date, t2.cena,t1.cena ;
from ( SELECT tovar ,date,MAX(cena) as cena,(SELECT MAX(date) date from table1 t3 where t3.tovar=table1.tovar AND t3.date<table1.date ) as d2 FROM table1 GROUP BY tovar,date) t1 ;
left join ( SELECT tovar,date,MAX(cena) as cena FROM table1 t group BY t.tovar,t.date) t2 on t2.tovar= t1.tovar and t2.date = t1.d2 ;
ORDER BY 1,2


Вот сдесь что то есть,
но мне мен надо каждой записи товара
одну запись с истории цены на указанную дату
...
Рейтинг: 0 / 0
История изменений
    #37741629
vorvv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
select a.itemid, a.date, a.cost ;
from price as a ;
where a.date = ;
(select max(b.date) from price as b where b.itemid = a.itemid and b.date <= ldDate)

Кстати это запрос работает, но очень долго!!!
...
Рейтинг: 0 / 0
История изменений
    #37751581
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vorvv , а если не использовать sql-вские методики? Вернее, использовать CTE?
То есть, просто сделать временную таблицу вместо внутреннего селекта?
...
Рейтинг: 0 / 0
История изменений
    #37751839
vorvv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AndreTM vorvv , а если не использовать sql-вские методики? Вернее, использовать CTE?
То есть, просто сделать временную таблицу вместо внутреннего селекта?

Над этим я думал.
Но что бы сделать временную табличку опять таки надо выбирать записи
у которых дата <= указанной и каждому товару одна запись
Если есть идеи или знаете как - подскажите!!!
...
Рейтинг: 0 / 0
История изменений
    #37752251
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vorvvкак выбрать цену на определенную дату - заранее известна
код IDTOVAR из таблички товаров соответствует
кодам ТОВАР1 ... из таблички истории цены
Если у автора с русским языком порядок, то как я понимаю надо ОДНО число, т.е. цену на конкретный товар.
При наличии индекса "Товар+Дата" решается с помощью команды SEEK.
Код: sql
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.
set Near On && обязательно для SEEK

create cursor price (nTovarId i, dDate d, nPrice n(12,2))
insert into price values (1, date() - 20, 100) 
insert into price values (1, date() - 10, 120) 
insert into price values (1, date() - 0, 130) 
insert into price values (1, date() + 10, 140) 
insert into price values (2, date() - 20, 200) 
insert into price values (2, date() - 10, 220) 
insert into price values (2, date() - 0, 230) 
insert into price values (2, date() + 10, 240) 

index on str(nTovarId, 10) + dtoc(dDate, 1) tag TovDate

* Искомые дата и товар
ldDate = date() - 10
lnTovarId = 1

* поиск
set Order To TovDate in price

seek str(lnTovarId, 10) + dtoc(ldDate, 1) in price
if !found('price')
	skip -1 in price
endif
if price.nTovarId = lnTovarId and dDate <= ldDate
	? price.nPrice
else
	? 'Не найдено'
endif
...
Рейтинг: 0 / 0
История изменений
    #37752552
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
История изменений
    #37752727
vorvv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВладимирМ,Dima T
Огромное спасибо за информацию и за то что отзываетесь!!!
Прочту проанализирую скажу результат!!
Вопрос пока не закрываю!!
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / История изменений
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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