powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / SQL Запрос
12 сообщений из 12, страница 1 из 1
SQL Запрос
    #37517430
Фотография Telum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уважаемые пользователи, подскажите как оптимальнее составить такой запрос:
Имеем таблицу (одну) в ней есть 3 поля:
c_namec_type n_kolvoКоля груша 5 Коля яблоко 2Аня яблоко 3 Аня мандарины 1Коля вишня 6Коля груша 4Сергей абрикос 2
Задача: создать агрегированную и сгруппированную таблицу вида:
c_namen_grusha n_yabloko n_mandarin n_vishnya n_abrikosКоля 9 2060 Аня 0 3100 Сергей 0 0002

Как бы Вы решили эту задачу?
...
Рейтинг: 0 / 0
SQL Запрос
    #37517441
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тебе потом куда эту таблицу? Если в эксель, то лучше там поразбирайся со сводными таблицами.
...
Рейтинг: 0 / 0
SQL Запрос
    #37517588
reware
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А непременно это сделать запросом ? А обычным способом (SET KEY, SET FILTER и пр.) низзя ?
...
Рейтинг: 0 / 0
SQL Запрос
    #37518250
Sea_Cat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Telum,
Для этих целей есть программа кросс-табуляции VFPXTAB.PRG (или GENXTAB.PGR в старых версиях FoxPro). Зачем ломать голову на запросом, если есть готовый инструмент?
...
Рейтинг: 0 / 0
SQL Запрос
    #37518905
Фотография Telum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TТебе потом куда эту таблицу? Если в эксель, то лучше там поразбирайся со сводными таблицами.
Нет, Excel не подойдет, т.к. это начальный этап консолидации, дальше расчеты и потом самописный вывод в HTML.
reware А непременно это сделать запросом ? А обычным способом (SET KEY, SET FILTER и пр.) низзя ?
Нет, так уже и реализовано, я ищу способы оптимизации.
Sea_Cat Telum,
Для этих целей есть программа кросс-табуляции VFPXTAB.PRG (или GENXTAB.PGR в старых версиях FoxPro). Зачем ломать голову на запросом, если есть готовый инструмент?
Спасибо за напоминание данного инструмента, но я не думаю, что его стоит применять в таком "пустяшном" случаи.
На данный момент мое решение такое:
1. Создаем
Код: plaintext
1.
2.
select distinct c_type;
 from table1;
into array laArray1
Вот на руках есть у нас выборка "полей" для итоговой таблицы, далее создаем строку с элементами массива и используем её как макроподстановку в новом запросе. Дальше решение сводится к запросу к таблице table1. Вот с ним у меня и проблемы. Не могу решить данный вопрос, прошу Вашей помощи.
...
Рейтинг: 0 / 0
SQL Запрос
    #37519045
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще-то, можно просто "расковырять" программу VFPXTAB.PRG (GENXTAB.PGR). В смысле, посмотреть ее код через

Код: plaintext
Modify Command (_genxtab)

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

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
select ;
    c_name ;
    ,SUM(iif(c_type = "груша", n_kolvo, n_kolvo-n_kolvo)) as n_grusha ;
    ,SUM(iif(c_type = "яблоко", n_kolvo, n_kolvo-n_kolvo)) as n_yabloko ;
    ,SUM(iif(c_type = "мандарины", n_kolvo, n_kolvo-n_kolvo)) as n_mandarin ;
    ,SUM(iif(c_type = "вишня", n_kolvo, n_kolvo-n_kolvo)) as n_vishnya ;
    ,SUM(iif(c_type = "абрикос", n_kolvo, n_kolvo-n_kolvo)) as n_abrikos ;
from MyTab ;
group by c_name

Использовать конструкцию IIF(...,"значение", 0) - нельзя, поскольку размерность поля вычисляется по первой попавшейся записи ДО собственно выполнения выборки. И если для первой попавшейся записи будет вычислено значение 0, то итоговой размерности может и не хватить, чтобы вписать результат. Впрочем, если у Вас VFP9, то можно использовать CAST(), чтобы явно указать размерность. Примерно так

IIF(...,"значение", CAST(0 as N(10)))
...
Рейтинг: 0 / 0
SQL Запрос
    #37519068
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я бы все-таки использовал VFPXTAB.PRG (GENXTAB.PRG).
Можно и просто как процедуру (все параметры достаточно внятно описаны).
Можно и мастер запустить и посмотреть, как формируется запрос - затем действовать по аналогии.
Просто готовый код уже учитывает многие нюансы, которые вы будете постигать заново... Раз Cross-Tab Wizard никуда не делся из Фокса до сих пор - значит он кому-то нужен и устраивает.
...
Рейтинг: 0 / 0
SQL Запрос
    #37519891
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если кроме создания еще и скорость важна, то примерно так можно попробовать
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
create cursor result (cName c( 10 ))
index on cName tag cName
sele MyTable
set order to && с индексом SCAN тормозит
scan
    if !IndexSeek(MyTable.cName, .T., 'result', 'cName')
       append blank in result
       repl in result cName with MyTable.cName
    endif
    lcField = alltrim(MyTable.cType)
    try
      repl in result &lcField with eval('result.' + lcField) + MyTable.nKolvo
    catch
      * нет поля
      alter table result add column &lcField i
      repl in result &lcField with eval('result.' + lcField) + MyTable.nKolvo
    endtry
endscan
sele result
brow

Думаю принцип понятен, сам не запускал - возможно чего напутал по мелочи. Не заработает - пиши подправлю.
и в catch надо бы проверку ошибок дописать.
...
Рейтинг: 0 / 0
SQL Запрос
    #37520770
Фотография Telum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TЕсли кроме создания еще и скорость важна, то примерно так можно попробовать
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
create cursor result (cName c( 10 ))
index on cName tag cName
sele MyTable
set order to && с индексом SCAN тормозит
scan
    if !IndexSeek(MyTable.cName, .T., 'result', 'cName')
       append blank in result
       repl in result cName with MyTable.cName
    endif
    lcField = alltrim(MyTable.cType)
    try
      repl in result &lcField with eval('result.' + lcField) + MyTable.nKolvo
    catch
      * нет поля
      alter table result add column &lcField i
      repl in result &lcField with eval('result.' + lcField) + MyTable.nKolvo
    endtry
endscan
sele result
brow

Думаю принцип понятен, сам не запускал - возможно чего напутал по мелочи. Не заработает - пиши подправлю.
и в catch надо бы проверку ошибок дописать.
Спасибо за ответ, однако мне больше "подуше" вариант ВладимираМ. Спасибо.
...
Рейтинг: 0 / 0
SQL Запрос
    #37520776
доброго вечера
извините,мож надо было в факе спросить,но не нашел там подходящей темы
скажите пожалуйста,зависит ли компонент RXQuery от BDE или нет?
плиз
...
Рейтинг: 0 / 0
SQL Запрос
    #37521264
Владимир Збудовскийдоброго вечера
извините,мож надо было в факе спросить,но не нашел там подходящей темы
скажите пожалуйста,зависит ли компонент RXQuery от BDE или нет?
плизВ фоксе нет понятий "компонент", "RXQuery" и "BDE". Обратитесь в профильный форум.
...
Рейтинг: 0 / 0
SQL Запрос
    #37521307
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / SQL Запрос
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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