powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Помогите с запросом
25 сообщений из 32, страница 1 из 2
Помогите с запросом
    #36139604
Новичок 2009
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день! Помогите с запросом. Имеется две таблицы
1- таблица
RnВходящий остаток0011000020003 700
2-я таблица
master_rnДатаОборот00117.01.20095000120.01.200920000117.01.200910000219.01.200930000220.01.2009400
Эти две таблицы связаны как Rn с Masret_rn
Необходимо получить входящий остаток и оборот за определенное число
Например на 17.01.2009
RnВходящий остатокОборот001100150002000037000
...
Рейтинг: 0 / 0
Помогите с запросом
    #36139773
Tohan_ORA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Новичок 2009Добрый день! Помогите с запросом.

Что-то типа этого ...
Код: plaintext
1.
2.
3.
CREATE CURSOR c1(rn c( 3 ),ost i)
INSERT INTO c1 values('001', 100 )
INSERT INTO c1 values('002', 00 )
INSERT INTO c1 values('003', 700 )

Код: plaintext
1.
2.
3.
4.
5.
6.
CREATE CURSOR c2(master_rn c( 3 ),dt date,oborot i)

INSERT into c2 values('001',DATE( 2009 , 1 , 17 ), 50 )
INSERT into c2 values('001',DATE( 2009 , 1 , 20 ), 200 )
INSERT into c2 values('001',DATE( 2009 , 1 , 17 ), 100 )
INSERT into c2 values('002',DATE( 2009 , 1 , 19 ), 300 )
INSERT into c2 values('002',DATE( 2009 , 1 , 20 ), 400 )

Код: plaintext
v_dt=DATE( 2009 , 1 , 17 )

Код: plaintext
1.
2.
3.
SELECT c1.rn,c1.ost,SUM(NVL(oborot, 0 )) oborot ;
from c1 left join c2;
on c1.rn=c2.master_rn and dt<=m.v_dt;
GROUP BY c1.rn,c1.ost
...
Рейтинг: 0 / 0
Помогите с запросом
    #36139912
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tohan_ORAНовичок 2009Добрый день! Помогите с запросом.

Что-то типа этого ...
Код: plaintext
1.
2.
3.
CREATE CURSOR c1(rn c( 3 ),ost i)
INSERT INTO c1 values('001', 100 )
INSERT INTO c1 values('002', 00 )
INSERT INTO c1 values('003', 700 )

Код: plaintext
1.
2.
3.
4.
5.
6.
CREATE CURSOR c2(master_rn c( 3 ),dt date,oborot i)

INSERT into c2 values('001',DATE( 2009 , 1 , 17 ), 50 )
INSERT into c2 values('001',DATE( 2009 , 1 , 20 ), 200 )
INSERT into c2 values('001',DATE( 2009 , 1 , 17 ), 100 )
INSERT into c2 values('002',DATE( 2009 , 1 , 19 ), 300 )
INSERT into c2 values('002',DATE( 2009 , 1 , 20 ), 400 )

Код: plaintext
v_dt=DATE( 2009 , 1 , 17 )

Код: plaintext
1.
2.
3.
SELECT c1.rn,c1.ost,SUM(NVL(oborot, 0 )) oborot ;
from c1 left join c2;
on c1.rn=c2.master_rn and dt<=m.v_dt;
GROUP BY c1.rn,c1.ost

Не все так просто. А попробуйте добавить строчку во вторую таблицу вида:
INSERT into c2 values('005',DATE(2009,1,17),50) - т.е. обороты есть, в входящего остатка нет. Вполне частый вариант.
С уважением, Алексей.
...
Рейтинг: 0 / 0
Помогите с запросом
    #36139988
Tohan_ORA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Aleksey-K
Не все так просто. А попробуйте добавить строчку во вторую таблицу вида:
INSERT into c2 values('005',DATE(2009,1,17),50) - т.е. обороты есть, в входящего остатка нет. Вполне частый вариант.
С уважением, Алексей.

Тогда можно так попробовать
Код: plaintext
INSERT into c2 values('005',DATE( 2009 , 1 , 17 ), 50 ) 
Код: plaintext
1.
2.
3.
4.
SELECT x.rn,NVL(ost, 0 ),SUM(NVL(oborot, 0 )) from;
(SELECT rn FROM c1 UNION select master_rn FROM c2)x;
left JOIN c1 ON x.rn=c1.rn;
left JOIN c2 ON x.rn=c2.master_rn AND dt<=m.v_dt;
group BY x.rn,ost

rn exp_2 sum_exp_3001 100 150002 0 0003 700 0005 0 50
...
Рейтинг: 0 / 0
Помогите с запросом
    #36140053
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вместо LEFT JOIN надо FULL JOIN

Код: plaintext
1.
2.
3.
4.
SELECT NVL(c1.rn,master_rn) AS rn, SUM(NVL(c1.ost,  0 )) AS Ost, SUM(NVL(oborot, 0 )) oborot ;
from c1 full join c2;
on c1.rn=c2.master_rn and dt<=m.v_dt ;
GROUP BY  1  ;
ORDER BY  1 
С уважением, Алексей
...
Рейтинг: 0 / 0
Помогите с запросом
    #36140074
Tohan_ORA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Aleksey-KВместо LEFT JOIN надо FULL JOIN

Код: plaintext
1.
2.
3.
4.
SELECT NVL(c1.rn,master_rn) AS rn, SUM(NVL(c1.ost,  0 )) AS Ost, SUM(NVL(oborot, 0 )) oborot ;
from c1 full join c2;
on c1.rn=c2.master_rn and dt<=m.v_dt ;
GROUP BY  1  ;
ORDER BY  1 
С уважением, Алексей

А если добавить ещё данных ...!?
Код: plaintext
1.
2.
INSERT into c2 values('005',DATE( 2009 , 1 , 17 ), 50 )
INSERT into c2 values('005',DATE( 2009 , 1 , 12 ), 10 )
INSERT into c2 values('005',DATE( 2009 , 2 , 12 ), 100 )
...
Рейтинг: 0 / 0
Помогите с запросом
    #36140079
Tohan_ORA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
+
Код: plaintext
INSERT into c2 values('006',DATE( 2009 , 4 , 2 ), 100 )
...
Рейтинг: 0 / 0
Помогите с запросом
    #36140756
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tohan_ORA+
Код: plaintext
INSERT into c2 values('006',DATE( 2009 , 4 , 2 ), 100 )

Согласен, тогда исключим из оборотов записи по дате в подзапросе:
Код: plaintext
1.
2.
3.
SELECT NVL(c1.rn, t.master_rn) AS rn, SUM(NVL(c1.ost,  0 )) AS Ost, SUM(NVL(t.oborot, 0 )) oborot ;
from c1 full join (SELECT master_rn, dt,oborot FROM c2 WHERE dt<=m.v_dt) t on c1.rn=t.master_rn ;
GROUP BY  1  ;
ORDER BY  1 

С уважением, Алексей
...
Рейтинг: 0 / 0
Помогите с запросом
    #36140961
Tohan_ORA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Aleksey-K
SELECT NVL(c1.rn, t.master_rn) AS rn, SUM(NVL(c1.ost, 0)) AS Ost, SUM(NVL(t.oborot,0)) oborot ;
from c1 full join (SELECT master_rn, dt,oborot FROM c2 WHERE dt<=m.v_dt) t on c1.rn=t.master_rn ;
GROUP BY 1 ;
ORDER BY 1

Алексей, что выдаст такой запрос по входящему остатку по RN=1 и по RN=6 !?

Если через full join,то можно попробовать и что-то вроде этого,но в боевом запросе я бы full join не использовал бы:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
CREATE CURSOR c1(rn c( 3 ),ost i)
INSERT INTO c1 values('001', 100 )
INSERT INTO c1 values('002', 00 )
INSERT INTO c1 values('003', 700 )

CREATE CURSOR c2(master_rn c( 3 ),dt date,oborot i)
INSERT into c2 values('001',DATE( 2009 , 1 , 17 ), 50 )
INSERT into c2 values('001',DATE( 2009 , 1 , 20 ), 200 )
INSERT into c2 values('001',DATE( 2009 , 1 , 17 ), 100 )
INSERT into c2 values('002',DATE( 2009 , 1 , 19 ), 300 )
INSERT into c2 values('002',DATE( 2009 , 1 , 20 ), 400 )

v_dt=DATE( 2009 , 1 , 17 )
+
INSERT into c2 values('005',DATE( 2009 , 1 , 17 ), 50 )
INSERT into c2 values('005',DATE( 2009 , 1 , 12 ), 10 )
INSERT into c2 values('005',DATE( 2009 , 2 , 12 ), 100 )
INSERT into c2 values('006',DATE( 2009 , 4 , 2 ), 100 )


Код: plaintext
1.
2.
3.
SELECT NVL(rn,master_rn) AS rn, NVL(ost,  0 ) ost, SUM(IIF(dt<=m.v_dt,oborot, 0 )) oborot ;
from c1 full join c2;
on rn=master_rn;
GROUP BY  1 , 2 
...
Рейтинг: 0 / 0
Помогите с запросом
    #36141158
Новичок 2009
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
to Tohan_ORA
to Aleksey-K
Спасибо. Разобрался. Не подскажите еще каким образом введенные пользователем параметры модальной формы передать в мой запрос??
...
Рейтинг: 0 / 0
Помогите с запросом
    #36141343
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tohan_ORAAleksey-K
SELECT NVL(c1.rn, t.master_rn) AS rn, SUM(NVL(c1.ost, 0)) AS Ost, SUM(NVL(t.oborot,0)) oborot ;
from c1 full join (SELECT master_rn, dt,oborot FROM c2 WHERE dt<=m.v_dt) t on c1.rn=t.master_rn ;
GROUP BY 1 ;
ORDER BY 1

Алексей, что выдаст такой запрос по входящему остатку по RN=1 и по RN=6 !?

Если через full join,то можно попробовать и что-то вроде этого,но в боевом запросе я бы full join не использовал бы:

+
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
CREATE CURSOR c1(rn c( 3 ),ost i)
INSERT INTO c1 values('001', 100 )
INSERT INTO c1 values('002', 00 )
INSERT INTO c1 values('003', 700 )

CREATE CURSOR c2(master_rn c( 3 ),dt date,oborot i)
INSERT into c2 values('001',DATE( 2009 , 1 , 17 ), 50 )
INSERT into c2 values('001',DATE( 2009 , 1 , 20 ), 200 )
INSERT into c2 values('001',DATE( 2009 , 1 , 17 ), 100 )
INSERT into c2 values('002',DATE( 2009 , 1 , 19 ), 300 )
INSERT into c2 values('002',DATE( 2009 , 1 , 20 ), 400 )

v_dt=DATE( 2009 , 1 , 17 )
+
INSERT into c2 values('005',DATE( 2009 , 1 , 17 ), 50 )
INSERT into c2 values('005',DATE( 2009 , 1 , 12 ), 10 )
INSERT into c2 values('005',DATE( 2009 , 2 , 12 ), 100 )
INSERT into c2 values('006',DATE( 2009 , 4 , 2 ), 100 )


Код: plaintext
1.
2.
3.
SELECT NVL(rn,master_rn) AS rn, NVL(ost,  0 ) ost, SUM(IIF(dt<=m.v_dt,oborot, 0 )) oborot ;
from c1 full join c2;
on rn=master_rn;
GROUP BY  1 , 2 

А я бы даже так сделал:
Код: plaintext
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.
CREATE CURSOR c1(rn c( 3 ),ost i)
INSERT INTO c1 values('001', 100 )
INSERT INTO c1 values('002', 00 )
INSERT INTO c1 values('003', 700 )
INSERT INTO c1 values('005',- 100 )
INSERT INTO c1 values('008', 100 )

CREATE CURSOR c2(master_rn c( 3 ),dt date,oborot i)

INSERT into c2 values('001',DATE( 2009 , 1 , 17 ), 50 )
INSERT into c2 values('005',DATE( 2009 , 1 , 12 ), 666 )
INSERT into c2 values('001',DATE( 2009 , 1 , 20 ), 200 )
INSERT into c2 values('001',DATE( 2009 , 1 , 17 ), 100 )
INSERT into c2 values('002',DATE( 2009 , 1 , 19 ), 300 )
INSERT into c2 values('002',DATE( 2009 , 1 , 20 ), 400 )

INSERT into c2 values('005',DATE( 2009 , 1 , 17 ), 50 )
INSERT into c2 values('006',DATE( 2009 , 1 , 12 ), 100 )
INSERT into c2 values('005',DATE( 2009 , 1 , 12 ), 10 )
INSERT into c2 values('005',DATE( 2009 , 2 , 12 ), 100 )
INSERT into c2 values('006',DATE( 2009 , 4 , 2 ), 100 )

v_dt=DATE( 2009 , 1 , 17 )
SELECT t.rn, SUM(t.InSaldo) AS InSaldo, SUM(t.Oborot) AS Oborot, SUM(t.OutSaldo) AS OutSaldo FROM ;
(SELECT rn, Ost AS InSaldo,  0  AS Oborot, Ost AS OutSaldo FROM c1 ;
UNION ALL ;
SELECT master_rn,  0 , SUM(oborot), SUM(oborot) FROM c2 WHERE dt<=m.v_dt GROUP BY master_rn) t ;
GROUP BY t.rn ;
ORDER BY t.rn
С уважением, Алексей
...
Рейтинг: 0 / 0
Помогите с запросом
    #36145142
AlikWishin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Новичок 2009to Tohan_ORA
to Aleksey-K
Спасибо. Разобрался. Не подскажите еще каким образом введенные пользователем параметры модальной формы передать в мой запрос??
Им, кажись, ща не до тебя! вопрос оч интересный в плане поиска решения (для торговли особенно).

А твои параметры добавь куда нить типа
Код: plaintext
1.
2.
3.
_screen.addProperty([ИмяПеременной],ThisForm.Text1.VAlue)
...

А потом в Запросе
Код: plaintext
1.
Select ... where ... _screen.ИмяПеременной
...
Рейтинг: 0 / 0
Помогите с запросом
    #36146890
AlikWishin
А потом в Запросе
Код: plaintext
1.
Select ... where ... _screen.ИмяПеременной


ну сколько можно наступать на одни и те же грабли?! не надо в запросах использовать конструкции типа _screen.ИмяПеременной (или ЭтаФорма.Проперти), т.к. запрос будет первым делом искать таблицу с именем _screen, а в ней поле с именем ИмяПеременной

в запросах делать надо так:
Код: plaintext
1.
2.
МояПеременная = _screen.ИмяПеременной
Select ... where ... МояПеременная

PS. а вот конструкции типа МояТаблица.МоёПоле использовать можно...
...
Рейтинг: 0 / 0
Помогите с запросом
    #36191215
Бонни
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Помогите чайнику:
имеется запрос
Select
zordspM.name,
zSubDiv.name
from zordspM,zSubDiv....
where
....

Ругается на неуникальность поля name (((. Как обойти это в выборе полей?
Пробовала обозвать zordspM.name as a_1 например. Эффекту ноль. Как верно?
...
Рейтинг: 0 / 0
Помогите с запросом
    #36191240
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: Бонни
> Ругается на неуникальность поля name (((. Как обойти это в выборе полей?

Полный текст запроса покажи


Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Помогите с запросом
    #36191266
БонниПомогите чайнику:
имеется запрос
Select
zordspM.name,
zSubDiv.name
from zordspM,zSubDiv....
where
....

Ругается на неуникальность поля name (((. Как обойти это в выборе полей?
Пробовала обозвать zordspM.name as a_1 например. Эффекту ноль. Как верно?А при чем тут выбор полей? Почему решили, что ругань на выбор? После where ни одного name нет?
...
Рейтинг: 0 / 0
Помогите с запросом
    #36191691
GermanGM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Бонни, в SELECT еще и GROUP BY наверное есть? Если так, то попробуйте изменить перед выполнением запроса SET ENGINEBEHAVIOR на 70 (и восстановите после в исходное значение)
либо замените в запросе "неуникальные" поля, на которые Fox ругается, на любые агрегатные функции с их участием, например, MIN(...)
...
Рейтинг: 0 / 0
Помогите с запросом
    #36195189
Бонни
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Накосячила сама). Закомментила во FROM табличку нужную.
Сейчас назрел другой :
использую в запросе 9 штук join. Суть такова. В таблице 11 полей, каждое из которых связано со своей табличкой по left join.использую в запросе 9 штук join и всё, дальше ошибка. Я так поняла ,что больше нельзя. Матерится при добавлении ещё 1 Join, что слишком много подзапросов "too many subqueries" - есть чем это лечить? Использую при подключении к БД Microsoft foxpro driver 6.0.Может, что повыше поставить?
Запросы пишу из PB 9, но думаю сама среда неважна.
...
Рейтинг: 0 / 0
Помогите с запросом
    #36195314
Бонни
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
На всякий случай поясню, т.к. путано написала. Мне нужно 11 join, а максимум ,сколько даёт написать, - 9. Ещё, мне из каждого соединения нужно будет использовать поля из связанной таблицы в Select , поэтому exists -ом заменить нельзя.
...
Рейтинг: 0 / 0
Помогите с запросом
    #36195776
БонниНакосячила сама). Закомментила во FROM табличку нужную.
Сейчас назрел другой :
использую в запросе 9 штук join. Суть такова. В таблице 11 полей, каждое из которых связано со своей табличкой по left join.использую в запросе 9 штук join и всё, дальше ошибка. Я так поняла ,что больше нельзя. Матерится при добавлении ещё 1 Join, что слишком много подзапросов "too many subqueries" - есть чем это лечить? Использую при подключении к БД Microsoft foxpro driver 6.0.Может, что повыше поставить?Угу. VFP OLDB Provider с сайта мелкомягких.
...
Рейтинг: 0 / 0
Помогите с запросом
    #36197479
Бонни
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Скачала, поставила. Никаких изменений(((.
...
Рейтинг: 0 / 0
Помогите с запросом
    #36197502
Бонни
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я с Фоксом не работала,можно по-подробнее порядок действий с OLE DB Provider?
...
Рейтинг: 0 / 0
Помогите с запросом
    #36197518
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: Бонни
> Я с Фоксом не работала,можно по-подробнее порядок действий с OLE DB Provider?

Да разбей ты свои 12 джоинов на несколько отдельных запросов и не парься


Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Помогите с запросом
    #36197547
БонниСкачала, поставила. Никаких изменений(((.От простой установки и не должно ничего измениться. Строку подключения как минимум надо поменять.
...
Рейтинг: 0 / 0
Помогите с запросом
    #36225463
Бонни
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Снова требуется помощь:
в запросе необходимо поставить подобное условие:

where
date(string(zHis.year,'-',zHis.month,'-01')) <={^2008-12-31}

Как написать правильно?

поле zHis.year - строка вида(2008, 2009) - число
поле zHis.month- строка вида (01, 02,...) - число.

Пытаюсь привести к виду
date("2008-05-01"), но без хэлпа по ф-циям проблематично.
...
Рейтинг: 0 / 0
25 сообщений из 32, страница 1 из 2
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Помогите с запросом
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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