Гость
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Запрос JOIN / 21 сообщений из 21, страница 1 из 1
22.03.2013, 15:00
    #38194973
Alexandr29
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос JOIN
Помогите составить запрос:
Есть 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
22.03.2013, 15:35
    #38195038
PaulWist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос JOIN
Код: 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
22.03.2013, 15:43
    #38195054
Alexandr29
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос JOIN
PaulWist,
Ost.op_kodn, это я ошибся должно быть Ost.kodn
str() не обязательна, можно как угодно, просто код задан в числовом формате
...
Рейтинг: 0 / 0
22.03.2013, 15:53
    #38195076
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос JOIN
Ты бы сразу показал какой результат хочешь получить. Табличкой, на примере приведенных исходных данных.
...
Рейтинг: 0 / 0
22.03.2013, 16:08
    #38195112
Reese
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос JOIN
Как я понял, что-то вроде этого должно получится
Код: 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
22.03.2013, 16:29
    #38195154
Alexandr29
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос JOIN
Dima T,
Должно получиться
kodnsuma105801005580
соответственно,
группа 10 это сумма всех, товаров, код которых начинается с 10, а
группа 1005 это сумма всех, товаров, код которых начинается с 1005

извиняюсь, если что не так объяснил
...
Рейтинг: 0 / 0
22.03.2013, 16:40
    #38195172
Alexandr29
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос JOIN
Reese,
Насчет групп Согласен.
Запрос сейчас проверить не получается
...
Рейтинг: 0 / 0
22.03.2013, 16:55
    #38195202
Reese
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос JOIN
E vtyz nfrjq jndtn b gjkexbkcz/
...
Рейтинг: 0 / 0
22.03.2013, 16:56
    #38195203
Reese
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос JOIN
Ой. Я имел ввиду, что у меня такой ответ и получился.
...
Рейтинг: 0 / 0
26.03.2013, 12:08
    #38198418
Alexandr29
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос JOIN
Reese,
Номер не прошел
...
Рейтинг: 0 / 0
26.03.2013, 14:21
    #38198676
pioner-v
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос JOIN
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
26.03.2013, 15:30
    #38198828
Reese
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос JOIN
2 pioner-v
Это почему поле group лишнее ? Я так понял выбрать надо как раз те, у кого group=.T.



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

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


Может быть я не понял задание. Не спорю.
Слишком "мал" контрольный пример,
чтобы сделать правильные выводы...
...
Рейтинг: 0 / 0
26.03.2013, 20:53
    #38199401
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос JOIN
Если я правильно понимаю, от необходимо организовать связь по первым символам. По частичному совпадению ключа. В строгом синтаксисе для этого используют опцию 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
27.03.2013, 09:21
    #38199934
Alexandr29
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос JOIN
Reese,
получилась вот такая таблица:kodnnamesnm10Двигатель .Null.1005Вал коленчатый и маховик.Null.

Остальные варианты опробую
...
Рейтинг: 0 / 0
27.03.2013, 09:39
    #38199950
Alexandr29
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос JOIN
На мой взгляд самый правильный вариант:
Код: 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
27.03.2013, 10:50
    #38200069
Reese
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос JOIN
2 Alexandr29
Понятно. Transform...
...
Рейтинг: 0 / 0
27.03.2013, 11:54
    #38200183
sg12
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос JOIN
Осталось понять, для чего нужно числа переводить в строки.
Если это индивидуальный код, то его лучше хранить в отдельном строковом поле и работать с ним отдельно.
А с самими таблицами работать через ключевые поля типа Integer.
Если, разумеется, не нужна постоянная головная боль со строковыми ID.

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


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