powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Запрос JOIN
21 сообщений из 21, страница 1 из 1
Запрос JOIN
    #38194973
Alexandr29
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Помогите составить запрос:
Есть 2 таблицы
1. Каталог:
kodn name group 10 Двигатель .t.1005 Вал коленчатый и маховик .t.1005034 Сальник к/вала .f....
2 Остатки
kodn snm1005034 580...
Необходимо получить суммы остатков по группам
примерно получается вот такой запрос
Код: sql
1.
2.
3.
4.
5.
6.
SELECT  Katalog.kodn, SUM(Ost.snm);
 FROM ;
     Katalog;
    LEFT OUTER JOIN ost ;
   ON  str(Katalog.kodn) = str(Ost.op_kodn);
 GROUP BY katalog.kodn


Я понимаю, что нужно изменить строку ON str(Katalog.kodn) = str(Ost.op_kodn);
но как не могу въехать
...
Рейтинг: 0 / 0
Запрос JOIN
    #38195038
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
SELECT  Katalog.kodn, SUM(Ost.snm);
 FROM ;
     Katalog;
    LEFT OUTER JOIN ost ;
   ON Katalog.kodn = Ost.kodn and Katalog.group;
 GROUP BY katalog.kodn



Только непонятно, почему надо вязать по str(), а так же чЁ за поле Ost.op_kodn и как оно согласуется с исходными данными?
...
Рейтинг: 0 / 0
Запрос JOIN
    #38195054
Alexandr29
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PaulWist,
Ost.op_kodn, это я ошибся должно быть Ost.kodn
str() не обязательна, можно как угодно, просто код задан в числовом формате
...
Рейтинг: 0 / 0
Запрос JOIN
    #38195076
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ты бы сразу показал какой результат хочешь получить. Табличкой, на примере приведенных исходных данных.
...
Рейтинг: 0 / 0
Запрос JOIN
    #38195112
Reese
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как я понял, что-то вроде этого должно получится
Код: sql
1.
2.
3.
4.
5.
select kt.kodn, max(kt.name) as name, sum(nvl(ost.snm,0)) as snm ;
	from katalog kt ;
	left join ost on transform(ost.kodn) like transform(kt.kodn)+"%" ;
	where kt.group ;
	group by kt.kodn



Но такая работа с группами, на мой взгляд, не очень корректна
...
Рейтинг: 0 / 0
Запрос JOIN
    #38195154
Alexandr29
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,
Должно получиться
kodnsuma105801005580
соответственно,
группа 10 это сумма всех, товаров, код которых начинается с 10, а
группа 1005 это сумма всех, товаров, код которых начинается с 1005

извиняюсь, если что не так объяснил
...
Рейтинг: 0 / 0
Запрос JOIN
    #38195172
Alexandr29
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Reese,
Насчет групп Согласен.
Запрос сейчас проверить не получается
...
Рейтинг: 0 / 0
Запрос JOIN
    #38195202
Reese
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
E vtyz nfrjq jndtn b gjkexbkcz/
...
Рейтинг: 0 / 0
Запрос JOIN
    #38195203
Reese
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ой. Я имел ввиду, что у меня такой ответ и получился.
...
Рейтинг: 0 / 0
Запрос JOIN
    #38198418
Alexandr29
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Reese,
Номер не прошел
...
Рейтинг: 0 / 0
Запрос JOIN
    #38198676
pioner-v
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alexandr29Dima T,
Должно получиться
kodnsuma105801005580
соответственно,
группа 10 это сумма всех, товаров, код которых начинается с 10, а
группа 1005 это сумма всех, товаров, код которых начинается с 1005

извиняюсь, если что не так объяснил

С учетом данного разъяснения, получается, что поле group лишнее,
так как можно ограничиться анализом длины и входимости кодов товаров
(контрольный пример в части остатков немного дополнен):
Код: 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.
CLOSE TABLES All
IF !File("Katalog.dbf")
 Create table Katalog free (Kodn C(7), name C(50), group L)
 Insert into Katalog value("10","Двигатель",.t.)
 Insert into Katalog value("1005","Коленчатый вал и маховик",.t.)
 Insert into Katalog value("1005034","Сальник к/вала",.f.)
ELSE
 USE Katalog IN 0
ENDIF

IF !File("Ost.dbf")
 Create table ost free (Kodn C(7), snm N(8.2))
 Insert into ost value("10",100)
 Insert into ost value("1005",200)
 Insert into ost value("1005034",580)
ELSE
 USE Ost IN 0
ENDIF

SELECT b.KodN, b.Name, SUM(b.snm) ;
FROM (Select z.KodN, ;
             SUBSTR(trim(d.KodN)+REPLICATE("*",7),1,LEN(trim(z.KodN))) as KodZ,;
             z.Name, d.snm from Katalog z, Ost d) b;
WHERE b.KodN=b.KodZ ;
GROUP BY 1, 2 ;
Order by 1

CLOSE TABLES All
...
Рейтинг: 0 / 0
Запрос JOIN
    #38198828
Reese
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 pioner-v
Это почему поле group лишнее ? Я так понял выбрать надо как раз те, у кого group=.T.



2 Alexandr29
авторНомер не прошел
А какой ответ получился ?
...
Рейтинг: 0 / 0
Запрос JOIN
    #38199186
sg12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ReeseНо такая работа с группами, на мой взгляд, не очень корректна

Для групп должна быть еще одна таблица с наименованиями групп - idtab,cname.
Тогда таблица "Каталог" примет вид - idtab,idgroup,cname.
Таблица "Остатки" - idtab,idkatalog,nsum
Тогда SELECT станет типовым, с двумя JOIN. По-моему, что-то похожее было в Tastrade.
...
Рейтинг: 0 / 0
Запрос JOIN
    #38199254
Ffffffffffffffff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нельзя задействовать в программе зарезервированные слова. Переименуйте поле "group".
...
Рейтинг: 0 / 0
Запрос JOIN
    #38199271
pioner-v
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Reese2 pioner-v
Это почему поле group лишнее ? Я так понял выбрать надо как раз те, у кого group=.T.


Может быть я не понял задание. Не спорю.
Слишком "мал" контрольный пример,
чтобы сделать правильные выводы...
...
Рейтинг: 0 / 0
Запрос JOIN
    #38199401
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если я правильно понимаю, от необходимо организовать связь по первым символам. По частичному совпадению ключа. В строгом синтаксисе для этого используют опцию LIKE

Код: sql
1.
2.
3.
4.
SELECT  Katalog.kodn, SUM(Ost.snm) ;
FROM Katalog ;
LEFT OUTER JOIN ost ON ltrim(str(Ost.kodn)) LIKE ltrim(str(Katalog.kodn)) + '%' ;
GROUP BY katalog.kodn



Поскольку LIKE работает только с символьными строками, то и необходимо перевести числа в строку.
...
Рейтинг: 0 / 0
Запрос JOIN
    #38199934
Alexandr29
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Reese,
получилась вот такая таблица:kodnnamesnm10Двигатель .Null.1005Вал коленчатый и маховик.Null.

Остальные варианты опробую
...
Рейтинг: 0 / 0
Запрос JOIN
    #38199950
Alexandr29
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На мой взгляд самый правильный вариант:
Код: sql
1.
2.
3.
4.
SELECT  Katalog.kodn, SUM(Ost.snm) ;
FROM Katalog ;
LEFT OUTER JOIN ost ON ltrim(str(Ost.kodn)) LIKE ltrim(str(Katalog.kodn)) + '%' ;
GROUP BY katalog.kodn



Всем большое спасибо за помощь.
...
Рейтинг: 0 / 0
Запрос JOIN
    #38200069
Reese
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 Alexandr29
Понятно. Transform...
...
Рейтинг: 0 / 0
Запрос JOIN
    #38200183
sg12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Осталось понять, для чего нужно числа переводить в строки.
Если это индивидуальный код, то его лучше хранить в отдельном строковом поле и работать с ним отдельно.
А с самими таблицами работать через ключевые поля типа Integer.
Если, разумеется, не нужна постоянная головная боль со строковыми ID.

Помнится, еще лет десять назад сам Владимир Максимов (тогда еще!) поучал:
"Не пытайтесь навесить на ключевые поля какие-либо еще функции кроме однозначной идентификации записи."
...
Рейтинг: 0 / 0
Запрос JOIN
    #38200216
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sg12Осталось понять, для чего нужно числа переводить в строки.Чтобы выбрать всех потомков/родителей.sg12Если это индивидуальный код, то его лучше хранить в отдельном строковом поле и работать с ним отдельно.Это код для указания положения в дереве. В стартпосте это чётко прослеживается. Но код весьма странно устроен, в частности, интересно, каким образом определяется окончание одного уровня и начало другого?..
sg12А с самими таблицами работать через ключевые поля типа Integer.
Если, разумеется, не нужна постоянная головная боль со строковыми ID.+1
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Запрос JOIN
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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