powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Сложный запрос к одной таблице
8 сообщений из 8, страница 1 из 1
Сложный запрос к одной таблице
    #35617089
Jimy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте! Подскажите, как создать хитрый запрос
Есть таблица, допустим, Продукты а в ней такие записи:

Дата Товар Количество Приход

01.01.08 Хлеб 500 +
01.08.08 Молоко 100 +
25.08.08 Хлеб 200 +
26.08.08 Хлеб 300 -

Как создать запрос, результатом которого будет например на 01.09.08

Наимен Остаток нач Приход Расход Остаток кон

Молоко 100 0 0 100
Хлеб 600 0 300 300

Можно, наверное создать несколько запросов (приход, расход и т.д.) и
засунуть результат в отчет, но мне кажется будет слишком громоздко.
Можно ли решить задачу одим запросом?
Спасибо.
...
Рейтинг: 0 / 0
Сложный запрос к одной таблице
    #35617096
Jimy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Простите, ошибка: во второй строке должно быть 700 0 300 400
...
Рейтинг: 0 / 0
Сложный запрос к одной таблице
    #35617105
homik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CREATE CURSOR tmp(dat D(8),tovar C(20),kol N(10),prih C(1))
INSERT INTO tmp(dat,tovar,kol,prih) values({^2008-10-01},"Хлеб",500,"+")
INSERT INTO tmp(dat,tovar,kol,prih) values({^2008-10-08},"Молоко",100,"+")
INSERT INTO tmp(dat,tovar,kol,prih) values({^2008-10-25},"Хлеб",200,"+")
INSERT INTO tmp(dat,tovar,kol,prih) values({^2008-10-26},"Хлеб",300,"-")

Local ldDat_beg,ldDat_end
m.ldDat_beg={^2008-10-01}
m.ldDat_end={^2008-10-31}

SELECT tovar,SUM(IIF(prih=="-",-1*kol,kol)) as kol FROM tmp WHERE Between(dat,m.ldDat_beg,m.ldDat_end) GROUP BY 1
...
Рейтинг: 0 / 0
Сложный запрос к одной таблице
    #35617106
Galyamov Rinat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для начала сделай сценарий создания исходной таблицы:

Create cursor ...
insert into ...


Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Сложный запрос к одной таблице
    #35617329
Jimy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CREATE CURSOR tmp(dat D(8),tovar C(20),kol N(10),prih C(1))
INSERT INTO tmp(dat,tovar,kol,prih) values({^2008-10-01},"Хлеб",500,"+")
INSERT INTO tmp(dat,tovar,kol,prih) values({^2008-10-08},"Молоко",100,"+")
INSERT INTO tmp(dat,tovar,kol,prih) values({^2008-10-25},"Хлеб",200,"+")
INSERT INTO tmp(dat,tovar,kol,prih) values({^2008-10-26},"Хлеб",300,"-")

Local ldDat_beg,ldDat_end
m.ldDat_beg={^2008-10-01}
m.ldDat_end={^2008-10-31}

SELECT tovar,SUM(IIF(prih=="-",-1*kol,kol)) as kol FROM tmp WHERE Between(dat,m.ldDat_beg,m.ldDat_end) GROUP BY 1



Приведеный код работает, спасибо! Это я и сам делал. Но нужен несколько иной результат:
например, диапазон с 01.10.2008 по 31.10.2008 и курсор примерно такого вида:

tovar ost_begin prihod rashod ost_end

То есть получить остаток по каждому наименованию на начало периода
сумма приходов/расходов за период и остатки на конец указанного периода

Сам вопрос - как все это запихнуть в один запрос? Или не получится?
Извините за неправильно сформулированный вопрос в самом начале
Спасибо!
...
Рейтинг: 0 / 0
Сложный запрос к одной таблице
    #35617366
Leonid_Riga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
3.
4.
5.
SELECT tovar, ;
   SUM(IIF(dat<m.ldDat_beg,IIF(prih=="-",- 1 *kol,kol), 0000 . 00 )) as ost_begin, ;
   SUM(IIF(Between(dat,m.ldDat_beg,m.ldDat_end) and prih=="+",kol, 0000 . 00 )) as prihod, ;
   SUM(IIF(Between(dat,m.ldDat_beg,m.ldDat_end) and prih=="-",kol, 0000 . 00 )) as rashod, ;
   SUM(IIF(dat<=m.ldDat_end,IIF(prih=="-",- 1 *kol,kol), 0000 . 00 )) as ost_end, ;
FROM tmp GROUP BY  1 
...
Рейтинг: 0 / 0
Сложный запрос к одной таблице
    #35617408
homik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторCREATE CURSOR tmp(dat D(8),tovar C(20),ost_beg N(10),kol N(10),prih C(1))
INSERT INTO tmp(dat,tovar,kol,prih) values({^2008-10-01},"Õëåá",500,"+")
INSERT INTO tmp(dat,tovar,kol,prih) values({^2008-10-08},"Ìîëîêî",100,"+")
INSERT INTO tmp(dat,tovar,kol,prih) values({^2008-10-25},"Õëåá",200,"+")
INSERT INTO tmp(dat,tovar,kol,prih) values({^2008-10-26},"Õëåá",300,"-")

CREATE CURSOR tmp_com(dat_per D(8),tovar C(20),ost_beg N(10),ost_end N(10))
INSERT INTO tmp_com(dat_per,tovar,ost_beg,ost_end) values({^2008-10-01},"Õëåá",0,600)
INSERT INTO tmp_com(dat_per,tovar,ost_beg,ost_end) values({^2008-10-01},"Ìîëîêî",0,100)



Local ldDat_beg,ldDat_end
m.ldDat_beg={^2008-10-01}
m.ldDat_end={^2008-10-31}

SELECT tmp.tovar,tmp_com.ost_end as ost_beg,SUM(IIF(prih=="+",kol,0)) as prihod,SUM(IIF(prih=="-",kol,0)) as rashod, ;
SUM(IIF(prih=="-",-1*kol,kol)) as kol, SUM(IIF(prih=="-",-1*kol,kol))+tmp_com.ost_end as ost_end FROM tmp ;
Inner JOIN tmp_com ON tmp_com.tovar=tmp.tovar.and.tmp_com.dat_per=m.ldDat_beg ;
WHERE Between(dat,m.ldDat_beg,m.ldDat_end) GROUP BY 1,2


ИМНО. Лучше создать допл. таблицу, в которой хранить остатки на начало и конец периода.
...
Рейтинг: 0 / 0
Сложный запрос к одной таблице
    #35621768
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Во-первых, нормализуйте базу. Что за детский сад - Количество/Приход? нельзя ли записать просто +500, -300, +200... - однозначно знак дает приход/расход.

Во-вторых, (как правильно замечено) - а где остатки?

В-третьих, простой оборот за период (без остатков) в этом случае строится обычным case(... sign (... sum( ... или у вас не SQL?
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Сложный запрос к одной таблице
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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