|
Сложный запрос к одной таблице
|
|||
---|---|---|---|
#18+
Здравствуйте! Подскажите, как создать хитрый запрос Есть таблица, допустим, Продукты а в ней такие записи: Дата Товар Количество Приход 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 Можно, наверное создать несколько запросов (приход, расход и т.д.) и засунуть результат в отчет, но мне кажется будет слишком громоздко. Можно ли решить задачу одим запросом? Спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2008, 07:05 |
|
Сложный запрос к одной таблице
|
|||
---|---|---|---|
#18+
Простите, ошибка: во второй строке должно быть 700 0 300 400 ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2008, 07:29 |
|
Сложный запрос к одной таблице
|
|||
---|---|---|---|
#18+
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 ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2008, 07:47 |
|
Сложный запрос к одной таблице
|
|||
---|---|---|---|
#18+
Для начала сделай сценарий создания исходной таблицы: Create cursor ... insert into ... Posted via ActualForum NNTP Server 1.4 ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2008, 07:47 |
|
Сложный запрос к одной таблице
|
|||
---|---|---|---|
#18+
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 То есть получить остаток по каждому наименованию на начало периода сумма приходов/расходов за период и остатки на конец указанного периода Сам вопрос - как все это запихнуть в один запрос? Или не получится? Извините за неправильно сформулированный вопрос в самом начале Спасибо! ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2008, 10:39 |
|
Сложный запрос к одной таблице
|
|||
---|---|---|---|
#18+
Код: plaintext 1. 2. 3. 4. 5.
... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2008, 10:52 |
|
Сложный запрос к одной таблице
|
|||
---|---|---|---|
#18+
автор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 ИМНО. Лучше создать допл. таблицу, в которой хранить остатки на начало и конец периода. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2008, 11:05 |
|
Сложный запрос к одной таблице
|
|||
---|---|---|---|
#18+
Во-первых, нормализуйте базу. Что за детский сад - Количество/Приход? нельзя ли записать просто +500, -300, +200... - однозначно знак дает приход/расход. Во-вторых, (как правильно замечено) - а где остатки? В-третьих, простой оборот за период (без остатков) в этом случае строится обычным case(... sign (... sum( ... или у вас не SQL? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.10.2008, 05:44 |
|
|
start [/forum/topic.php?fid=41&tid=1587142]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
64ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
45ms |
get tp. blocked users: |
1ms |
others: | 13ms |
total: | 166ms |
0 / 0 |