powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / как сделать SQL запрос, чтоб...
24 сообщений из 24, страница 1 из 1
как сделать SQL запрос, чтоб...
    #32270422
ValeraP2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
чтоб при групировке по полю num, текстовое поле text объединялось друг с другом, если оно попадает в условие групировки, например:

3 записи в таблице:
num text
1 text1
1 text2
1 text3
2 text4

в итоге должно быть 2записи в таблице:
1 text1 text2 text3
2 text4

как это реализовать SQL запросом ?
...
Рейтинг: 0 / 0
как сделать SQL запрос, чтоб...
    #32271400
malec
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А зачем это писать на SQL. А на фоксе что нельзя?
...
Рейтинг: 0 / 0
как сделать SQL запрос, чтоб...
    #32271409
Crip
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2malec
А вы думаете например на MSSQL это сделать можно? Там это тоже делается через функцию которая считает сумму по строке...
Короче нужен индекс по num, а дальше select distinct + функция суммирования строк...
...
Рейтинг: 0 / 0
как сделать SQL запрос, чтоб...
    #32272013
vklepko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну и для общности ещё надо положить строку, полученную в результате конкатенации, в Memo поле(или в text в MSSQL)
...
Рейтинг: 0 / 0
как сделать SQL запрос, чтоб...
    #32272379
Фотография brahew
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Crip, а можно примерчик показать
...
Рейтинг: 0 / 0
как сделать SQL запрос, чтоб...
    #32272419
Sergey Ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что-то я не понял, а разве так нельзя изобразить:

Код: plaintext
select num,iif(b>a, text1+ text2+ text3, space( 100 ) ) as text1, text4  from a  group by num

где:

b>a какое-то условие, о котором вы тут упоминали...

Или я снова чего-то не понял?
...
Рейтинг: 0 / 0
как сделать SQL запрос, чтоб...
    #32272426
Sergey Ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, надо убрать num и вместо iif поставить в конце условие where...

Так? Что-то условие задачи я не совсем понял, извините, если что не так...

Код: plaintext
select text1+ text2+ text3 as text1, text4  from table1 where a>b  group by num
...
Рейтинг: 0 / 0
как сделать SQL запрос, чтоб...
    #32272783
Victor Am
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IMHO нет такой возможности на VFP и MS SQL, SYBASE ASA поддерживает функцию LIST, которая позволяет выполнить "сворачивание".
...
Рейтинг: 0 / 0
как сделать SQL запрос, чтоб...
    #32273593
Sergey Ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А разве "сворачивание" не простая конкатенация символьных полей?
...
Рейтинг: 0 / 0
как сделать SQL запрос, чтоб...
    #32273658
Victor Am
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to (Sergey Ch)
В запросе:
Код: plaintext
1.
select text1+ text2+ text3 as text1, text4  from table1 where a>b  group by num

нет таких полей как:
text1,
text2,
text3,
text4
а есть два поля:
num,
text
...
Рейтинг: 0 / 0
как сделать SQL запрос, чтоб...
    #32273737
Sergey Ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
To: Victor Am

Большое спасибо за разъяснение, я вот и думал - что что-то тут не так.
Ничего на ум не приходит, кроме как написание программного кода...

Извините, если кого ввел в заблуждение...
...
Рейтинг: 0 / 0
как сделать SQL запрос, чтоб...
    #32274007
andrew_Pr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Одним Select-запросом в чистом виде эта задача не может быть выполнена.
Чтобы решить ее средствами Foxpro, достаточно 4-х строк кода. (Если интересно, могу показать как.)
НО в любом случае, если заранее не известно, сколько будет групп и сколько строк попадает в группировку (сколько слагаемых ) , то какой должна быть длина результирующего текстового поля? По всей видимости, хоть автор сабжа и не говорит об этом, предполагается, что число слагаемых в каждой группе строго ограничено. Тогда совсем другое дело. Тогда можно извратиться и SQL-запросом.
...
Рейтинг: 0 / 0
как сделать SQL запрос, чтоб...
    #32274373
Фотография NNN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Один селект:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
SELECT num, myfunc(num) FROM table1 GROUP BY num

FUNCTION myfunc
LPARAMETERS tnNum
LOCAL lcString as String 
LOCAL i as Integer 
LOCAL ARRAY laArray[ 1 ]
lcString=''
SELECT text FROM table1 INTO ARRAY laArray WHERE num=tnNum
FOR i= 1  TO ALEN(laArray)
	lcString=lcString+laArray[i]+CHR( 32 )
ENDFOR 
RETURN ALLTRIM(lcString)
ENDFUNC 

Про использование UDF ничего не говорилось, поэтому возражения не принимаются.
...
Рейтинг: 0 / 0
как сделать SQL запрос, чтоб...
    #32274727
andrew_Pr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to NNN
Про то, что без UDF не обойтись уже говорилось. См. Crip
Я же говорил об Select-запросе в чистом виде , т.е чтобы не пришлось писать ни чего кроме 1 select-оператора
Тебе пришлось написать еще 13 строк кода
Даже если выкинуть необязательные Local и EndFunc, то 9.
А я предлагал обойтись всего 4
...
Рейтинг: 0 / 0
как сделать SQL запрос, чтоб...
    #32274777
Фотография NNN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2andrew_Pr

> Даже если выкинуть необязательные Local и EndFunc, то 9.
А я предлагал обойтись всего 4


Дык покажи свои 4 строки, или ждешь особого приглашения? :)
...
Рейтинг: 0 / 0
как сделать SQL запрос, чтоб...
    #32275607
andrew_Pr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дык покажи свои 4 строки, или ждешь особого приглашения?
Жду. Люблю, когда меня попросят. :)
Код: plaintext
1.
2.
3.
4.
Select distinct num , space( 254 ) as text From table1 into cursor result1
index on num tag num
select table1
set relation to num into result1
replace result.text with rtrim(result.text)+' '+text All

Это работает на порядок быстрее, чем Select num, MyFunc(text)
...
Рейтинг: 0 / 0
как сделать SQL запрос, чтоб...
    #32275771
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей, ты не прав.

Для начала, код в таком виде в принципе неработоспособен, поскольку полученный таким образом курор - ReadOnly. Опция ReadWrite появилась только в 7 версии, а для более младших версий требуется переоткрытие курсора (как минимум еще пара строк).

Более существенно то, что при связи по SET RELATION ты фактически отбираешь только первую запись из нескольких с одинаковым значением поля Num. А как добавить значение из записей с тем же num?

Если уж ты твердо решил отказаться от Select-SQL, то надо бы писать так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
CREATE CURSOR result (num I, text M)
select MyTab
SET ORDER TO num
SCAN
	IF result.num=MyTab.num
		select result
		REPLACE text WITH ' '+MyTab.text ADDITIVE
	ELSE
		INSERT INTO result (num,text) VALUES (MyTab.num,MyTab.text)
	ENDIF
ENDSCAN
...
Рейтинг: 0 / 0
как сделать SQL запрос, чтоб...
    #32276149
Фотография NNN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2andrew_Pr

> Это работает на порядок быстрее, чем Select num, MyFunc(text)

Я тут проверил, Владимир прав, это вообще не работает, даже если добавить к SELECT READWRITE :) К тому же тут 5 строк.
В чем идея-то?

2ВладимирМ

> Опция ReadWrite появилась только в 7 версии

Неофициально после какого-то сервпака в 6-й. ИМХО.
...
Рейтинг: 0 / 0
как сделать SQL запрос, чтоб...
    #32276347
Фотография NNN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
От нечего делать продолжаю. По поводу скорости и правильности результатов (функцию я правда поправил)
Код: 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.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
CLEAR 
LOCAL i as Integer 
LOCAL j as Integer 
LOCAL n as Integer 
LOCAL lnSec as Decimal  
CREATE CURSOR table1 (num i, text c( 10 ))
INDEX on num TAG num
=RAND(- 1 )
FOR i= 1  TO  1000 
	n=INT(RAND()* 5 )+ 1 
	FOR j= 1  TO n
		INSERT INTO table1 VALUES (i,SYS( 2015 ))
	ENDFOR   
ENDFOR 

lnSec=SECONDS()
SELECT num, myfunc(num) FROM table1 GROUP BY num INTO CURSOR result
?SECONDS()-lnSec
SELECT result
BROWSE

lnSec=SECONDS()
Select distinct num , space( 254 ) as text From table1 into cursor result1 READWRITE 
index on num tag num
select table1
set relation to num into result1
replace all text with rtrim(text)+' '+table1.text IN result1
?SECONDS()-lnSec
SELECT result1
BROWSE

lnSec=SECONDS()
CREATE CURSOR result (num I, text M)
select Table1
SET ORDER TO num
SCAN
	IF result.num=Table1.num
		select result
		REPLACE text WITH ' '+Table1.text ADDITIVE
	ELSE
		INSERT INTO result (num,text) VALUES (Table1.num,Table1.text)
	ENDIF
ENDSCAN
?SECONDS()-lnSec
SELECT result
BROWSE

FUNCTION myfunc
LPARAMETERS tnNum
LOCAL lcString as String 
lcString=''
SCAN FOR num=tnNum
	lcString=lcString+text+' '
ENDSCAN 
RETURN ALLTRIM(lcString)
ENDFUNC 
...
Рейтинг: 0 / 0
как сделать SQL запрос, чтоб...
    #32276469
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Опции ReadWrite в 6 версии нет. Ни официально, ни неофициально. У меня VFP6SP5 (более поздних SP просто не было), так вот на ReadWrite выдает синтаксическую ошибку (неизвестная фраза).

По поводу кода приведенного andrew_Pr

идея в общем-то понятная, но проблема в том, что команда REPLACE очень капризна в отношении записи НЕ в текущую рабочую область (что в этом коде и делается). Таких присвоений желательно всячески избегать. Даже если это сработает один раз нет никаких гарантий что тот же самый код в другом месте тоже сработает.
...
Рейтинг: 0 / 0
как сделать SQL запрос, чтоб...
    #32276815
andrew_Pr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to ВладимирМ и NNN
Для начала, код в таком виде в принципе неработоспособен, поскольку полученный таким образом курор - ReadOnly
Да виноват, ReadWrite забыл дописать и в одном месте Result1 ,
а в другом Result .
На счет версии VFP. Я поэтому вооще-то и хотел свой код выставлять сразу. Может человек вообще к SQL-ной БД собрался обращаться, я мы тут перед ним Scan...endScan - ами трясем. Кстати сам автор вопроса-то уже и забил небось на него. А мы тут От нечего делать продолжаем :)
...
Рейтинг: 0 / 0
как сделать SQL запрос, чтоб...
    #32276867
andrew_Pr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в догонку
вооще-то и хотел читать: вооще-то и НЕ хотел
...
Рейтинг: 0 / 0
как сделать SQL запрос, чтоб...
    #32277008
andrew_Pr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to NNN
за тестировку спасибо.
А вот код-то мой вы переврали, поэтому и получилась лажа
у меня было
Код: plaintext
replace result1.text with rtrim(result1.text)+' '+text All

а вы извратили на
Код: plaintext
replace text with rtrim(text)+' '+text in Result1 All
,
а это не одно и тоже.
А в вашем-то коде какая лажа получается! Если окажется, что для первой группировочной записи myfunc возвращает строку из 1 слова ( т.е. в table1 с num=1 только 1 запись ), SQL и во всех остальных записях порежит Text до той же длины! Это конечно излечимо: не ALLTRIM(lcString), а PADR(lcString,254,' '), но все же...
...
Рейтинг: 0 / 0
как сделать SQL запрос, чтоб...
    #32277053
Фотография NNN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2andrew_Pr

Теперь все стало понятно. Делать действительно практически нечего :)
...
Рейтинг: 0 / 0
24 сообщений из 24, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / как сделать SQL запрос, чтоб...
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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