|
|
|
неполучается запрос с подсчетом колличества одних и других :(
|
|||
|---|---|---|---|
|
#18+
всем привет! проблема следующая имеется таблица "сотрудники" с полями название отдела, профессия, научное звание. нужно сделать скл запрос ччтобы показывал название отдела и колличество в нем профессоров и колличество доцентов.... помогите пожалуйста если кто может ) буду очень благодарен... :( весь день голову ламаю ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2008, 01:16 |
|
||
|
неполучается запрос с подсчетом колличества одних и других :(
|
|||
|---|---|---|---|
|
#18+
может типа того че нибудь: Код: plaintext 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2008, 02:36 |
|
||
|
неполучается запрос с подсчетом колличества одних и других :(
|
|||
|---|---|---|---|
|
#18+
нефкурилможет типа того че нибудь: Код: plaintext 1. 2. угу так я сделал :) спасибо :) а в одну строчку такова не сделать ?:) всмысле чтобы показывало и профессоров и доцентов в одной строке ?:) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2008, 08:16 |
|
||
|
неполучается запрос с подсчетом колличества одних и других :(
|
|||
|---|---|---|---|
|
#18+
select s.otdel, SUM(IIF(s.dolzhnost=1,1,0000)) as prof, SUM(IIF(s.dolzhnost=2,1,0000)) as docent, from sotrudniki s group by s.otdel Структура неизвестна, но принцип такой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2008, 08:53 |
|
||
|
неполучается запрос с подсчетом колличества одних и других :(
|
|||
|---|---|---|---|
|
#18+
Spiner угу так я сделал :) спасибо :) а в одну строчку такова не сделать ?:) всмысле чтобы показывало и профессоров и доцентов в одной строке ?:) Код: plaintext 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2008, 08:53 |
|
||
|
неполучается запрос с подсчетом колличества одних и других :(
|
|||
|---|---|---|---|
|
#18+
Spinerвсем привет! проблема следующая имеется таблица "сотрудники" с полями название отдела, профессия, научное звание. нужно сделать скл запрос ччтобы показывал название отдела и колличество в нем профессоров и колличество доцентов.... помогите пожалуйста если кто может ) буду очень благодарен... :( весь день голову ламаю Код: plaintext 1. 2. Если кроме проффесоров и доцентов в табличке есть ещё и другие звания,то необходимо во внутреннем запросе вначале выбрать только профессоров и доцентов, а из них уже подсчитывать по отделам. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2008, 10:04 |
|
||
|
неполучается запрос с подсчетом колличества одних и других :(
|
|||
|---|---|---|---|
|
#18+
спабибо !!! работает :D ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2008, 10:53 |
|
||
|
неполучается запрос с подсчетом колличества одних и других :(
|
|||
|---|---|---|---|
|
#18+
> SELECT t1.otdel,SUM(icase(t1.zvanie='Доцент',1,0)) as > sum_docent,SUM(icase(t1.zvanie='Профессор',1,0)) as sum_professor ; > from (SELECT otdel,zvanie from sotrudniki WHERE zvanie > in('Доцент','Профессор')) t1; > GROUP BY t1.otdel Чего-то не понял. А зачем в данном случае внутренний запрос??? Чем не устраивает конструкция: SELECT t1.otdel, SUM(icase(t1.zvanie='Доцент',1,0)) as sum_docent, SUM(icase(t1.zvanie='Профессор',1,0)) as sum_professor ; from sotrudniki t1; WHERE zvanie in('Доцент','Профессор')); GROUP BY t1.otdel Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2008, 05:47 |
|
||
|
неполучается запрос с подсчетом колличества одних и других :(
|
|||
|---|---|---|---|
|
#18+
Galyamov Rinat > SELECT t1.otdel,SUM(icase(t1.zvanie='Доцент',1,0)) as > sum_docent,SUM(icase(t1.zvanie='Профессор',1,0)) as sum_professor ; > from (SELECT otdel,zvanie from sotrudniki WHERE zvanie > in('Доцент','Профессор')) t1; > GROUP BY t1.otdel Чего-то не понял. А зачем в данном случае внутренний запрос??? Чем не устраивает конструкция: SELECT t1.otdel, SUM(icase(t1.zvanie='Доцент',1,0)) as sum_docent, SUM(icase(t1.zvanie='Профессор',1,0)) as sum_professor ; from sotrudniki t1; WHERE zvanie in('Доцент','Профессор')); GROUP BY t1.otdel Да согласен, внутренний запрос при выводе в строчку не нужен и предложение where тоже, т.к. icase()-обозначит за единицу только наименования указанные в нём(.t.), а остальные приравняет нулю (но если званий огромное количество то запрос с агрегированием может быть тяжёлым, гораздо легче выбирать из уже готового набора из двух должностей чем из 222 Хотя неизвестно как будет это делать фокс -возможно указанный запрос и будет самым легким) т.о.: Код: plaintext 1. 2. 3. *** Но при выводе построчно в один столбец без where не обойтись или отфильтровать во внутреннем подзапросе, т.о.: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2008, 11:49 |
|
||
|
неполучается запрос с подсчетом колличества одних и других :(
|
|||
|---|---|---|---|
|
#18+
beginner_fox Но при выводе построчно в один столбец без where не обойтись или отфильтровать во внутреннем подзапросе, т.о.: SELECT t1.otdel, t1.zvanie,count(*) ; from sotrudniki t1; WHERE zvanie in('Доцент','Профессор'); GROUP BY t1.otdel или SELECT t1.otdel, t1.zvanie,count(*) ; from (SELECT otdel,zvanie from sotrudniki WHERE zvanie in('Доцент','Профессор') )t1; GROUP BY t1.otdel Да,забыл добавить столбец select-a в группировку :-) Код: plaintext 1. 2. 3. 4. 5. 6. 7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2008, 11:54 |
|
||
|
неполучается запрос с подсчетом колличества одних и других :(
|
|||
|---|---|---|---|
|
#18+
> Да согласен, внутренний запрос при выводе в строчку не нужен и > предложение where тоже, т.к. > icase()-обозначит за единицу только наименования указанные в > нём(.t.), а остальные приравняет нулю > (но если званий огромное количество то запрос с агрегированием может > быть тяжёлым, гораздо легче выбирать из уже готового набора из двух > должностей чем из 222 Хотя неизвестно как будет это делать фокс -возможно > указанный запрос и будет самым легким) т.о.: А вот и нет. Если есть индекс по полю zvanie, то запрос с директивой WHERE отработает гораздо быстрее Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2008, 12:13 |
|
||
|
неполучается запрос с подсчетом колличества одних и других :(
|
|||
|---|---|---|---|
|
#18+
Galyamov Rinat > Да согласен, внутренний запрос при выводе в строчку не нужен и > предложение where тоже, т.к. > icase()-обозначит за единицу только наименования указанные в > нём(.t.), а остальные приравняет нулю > (но если званий огромное количество то запрос с агрегированием может > быть тяжёлым, гораздо легче выбирать из уже готового набора из двух > должностей чем из 222 Хотя неизвестно как будет это делать фокс -возможно > указанный запрос и будет самым легким) т.о.: А вот и нет. Если есть индекс по полю zvanie, то запрос с директивой WHERE отработает гораздо быстрее Хм ... Где написано, что фокс будеть хватать индекс с такой директивой? План выполнения разве в фоксе есть? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2008, 13:30 |
|
||
|
неполучается запрос с подсчетом колличества одних и других :(
|
|||
|---|---|---|---|
|
#18+
beginner_foxХм ... Где написано, что фокс будеть хватать индекс с такой директивой? План выполнения разве в фоксе есть? Смотри матчасть Sys(3054) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2008, 13:33 |
|
||
|
неполучается запрос с подсчетом колличества одних и других :(
|
|||
|---|---|---|---|
|
#18+
> Хм ... > Где написано, что фокс будеть хватать индекс с такой директивой? Help и иже с ним! > План выполнения разве в фоксе есть? План есть, но не для простых смертных :) sys(3054) позволяет оценить какие индексы подключились при выполнении запроса. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2008, 14:00 |
|
||
|
неполучается запрос с подсчетом колличества одних и других :(
|
|||
|---|---|---|---|
|
#18+
Galyamov Rinat > Хм ... > Где написано, что фокс будеть хватать индекс с такой директивой? Help и иже с ним! > План выполнения разве в фоксе есть? План есть, но не для простых смертных :) sys(3054) позволяет оценить какие индексы подключились при выполнении запроса. Вот спасибо!!! :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2008, 14:31 |
|
||
|
неполучается запрос с подсчетом колличества одних и других :(
|
|||
|---|---|---|---|
|
#18+
> Вот спасибо!!! :-) Ну и еще одна тонкость. Если по полю field1 есть индекс без дериктивы for, то он будет подключен в конструкции: select ... from table1 where field1=eValue Но не будет подключен в случае select ... from table1 where eValue = field1 Т.е. название поля должно стоять СЛЕВА от знака сравнения, а значение с которым идет сравнение поля, соответственно, СПРАВА Чтобы запрос был оптимизируемым по индексам, индексное выражение должно ПОЛНОСТЬЮ совпадать с тем, что стоит СЛЕВА от знака сравнения. Например, если индекс построен по Alltrim(field2), значит в конструкции where должно быть Alltrim(field2) == (=, >, <, IN (select ...) и т.д.) Чтобы запрос был полностью оптимизируемым по индексам нужно в таблицы добавить индекс по DELETED() Наличие индексов не всегда приводит к реальному ускорению в выборках. В каждом случае нужно самому оценивать обоснованность создания оных. Например, если значение поля field3 в подавляющем большинстве = 3, то наличие индекса по полю field3 в запросе вида: select * from table1 where field3=3 приведет к замедлению выборки. Т.к. FOX сначала просмотрит индексы, потом вытащит почти всю таблицу. Без индексов он просто вытащит почти всю таблицу, что может оказаться гораздо эффективнее (легче откинуть 5% записей от самой таблици после ее полного скачивания, чем прокачивать по сети весь индекс для принятия решения о том, какие записи необходимо скачать из таблици). В реальных таблицах значения полей как правило разные (нет больших групп (более 90% от общего кол-ва записей) с одинаковыми значениями), поэтому наличие индексов приводит к реальной оптимизации запросов, а вот количество удаленных записей как правило меньше чем 5% , поэтому наличие индекса по deleted() в такой ситуации привете лишь к замедлению выборки, не смотря на то, что sys(3054) заявит о полной оптимизации. И еще, нужно иметь в виду, что наличие индексов приводит к замеделнию операций вставки и изменения записей, т.к. при таких операциях есть необходимость изменения индекса! ПС. Выводы. Наличие индексов при грамотном подходе приводит к существенному выйгрышу во времени и нагрузке на сеть. При неграмотном (как нехватка, так и перебор) приводит к существенному замедлению. При этом нехватка индексов приводит к замедлению оперций выборки и доступа к данным, а перебор к замедлению модификации и добавления новых данных. В каждой конкретной ситуации необходимо искать компромис! Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2008, 06:40 |
|
||
|
неполучается запрос с подсчетом колличества одних и других :(
|
|||
|---|---|---|---|
|
#18+
Galyamov Rinat Без индексов он просто вытащит почти всю таблицу, что может оказаться гораздо эффективнее (легче откинуть 5% записей от самой таблици после ее полного скачивания, чем прокачивать по сети весь индекс для принятия решения о том, какие записи необходимо скачать из таблици). В реальных таблицах значения полей как правило разные (нет больших групп (более 90% от общего кол-ва записей) с одинаковыми значениями), поэтому наличие индексов приводит к реальной оптимизации запросов, а вот количество удаленных записей как правило меньше чем 5% , поэтому наличие индекса по deleted() в такой ситуации привете лишь к замедлению выборки, не смотря на то, что sys(3054) заявит о полной оптимизации. А про индекс delete() не совсем понял, если их около 5 или менее процентов, то наличие индекса должно ускорить выборку (SQL)... или я что-то не так понял??? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2008, 13:14 |
|
||
|
неполучается запрос с подсчетом колличества одних и других :(
|
|||
|---|---|---|---|
|
#18+
> А про индекс delete() не совсем понял, если их около 5 или менее > процентов, то наличие индекса должно ускорить выборку (SQL)... или я > что-то не так понял??? Суть вопроса в следующем. Если для доступа к данным можно использовать индекс (т.е. имеется соответствующий индекс) - то фокс подхватит его в любом случае. Исключением могут быть set opti off или выполнение команды с опцией noopti (brow for ... noopti и т.д.). Но при этом происходит отказ от всех индексов для данной команды. Итак, выяснили, что фокс использует по возможности индексы. Допустим есть индекс по deleted() и НЕТ удаленных записей в таблице. ПРи этом set deleted ON (если off - то необходимость в индексе по deleted отпадает и фок его не берет) Тогда любая команда использующая оптимизацию рашмора (в том числе select * from table 1 ) подключит индекс по deleted() Т.е. на локальную машину будет вытащен соответствующий индекс, просмотрен, принято решение о том, какие записи нужно вытянуть на локальную машину. А в данном случае это все записи. В случае, если индекаса по deleted() нет. Фокс просто прокачивает таблицу на локаль, проверяет что удаленных нет и все. Если удаленные записи есть, то с индексом - вытягиваем индекс, просматриваем для НЕУДАЛЕННЫХ, вытягиваем соответсвтующие записи. Без индекса - вытягиваем напрямую таблицу (сначала непосредственно в файле ..DBF смотрим есть ли метка к удалению каждой записи, если нет - вытягиваем всю запись). Так вот выборка данных с индексом будет тем эфективнее чем выборка без индекса, чем более разнородные данные хранятся в полях, по которым строится индексное выражение. Если удаленных 5 записей, а всего записей в таблице 1 000 000 - то естественно наличие индекса по deleted() только замедлит выборку. Потому что гораздо быстрее просмотреть непосредственно таблицу отказаться от пяти записей, чем целиком вытягивать индекс и в нем просматривать для неудаленных. А вот по первичному ключу наличие индека позволит МНОГОКРАТНО ускорить выборку, т.к. каждое значение ключа уникально и для того чтобы вытянуть ОДНУ запись гораздо эффективнее просмотреть индекс и найти одну запись, которую необходимо вытянуть, чем просматривать всю таблицу в поисках нужной записи. Этот ГРАНИЧНЫЙ процент "однородности", при котором происходит реальная оптимизация при применении индекса сильно зависит от значений индексного выражения и колеблется в районе 5 - 8 %%. Иными словами, если ты заранее знаешь, что в твою выборку ГАРАНТИРОВАННО попадет 95% всех записей из таблицы - то без индексов такой запрос отработает быстрее чем с индексами. PS Чего - то я разошелся :) Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2008, 05:21 |
|
||
|
неполучается запрос с подсчетом колличества одних и других :(
|
|||
|---|---|---|---|
|
#18+
Galyamov Rinat Если удаленных 5 записей, а всего записей в таблице 1 000 000 - то естественно наличие индекса по deleted() только замедлит выборку. Потому что гораздо быстрее просмотреть непосредственно таблицу отказаться от пяти записей, чем целиком вытягивать индекс и в нем просматривать для неудаленных. ..... PS Чего - то я разошелся :) Поясните, Вы говорите о фильтрованном индексе или же нет, если нет, то каков по Вашему размер индеса по deleted() для 5-ти записей для таблы в 1млн записей, из вышесказанного он получается размером с исходную таблицу ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2008, 09:21 |
|
||
|
неполучается запрос с подсчетом колличества одних и других :(
|
|||
|---|---|---|---|
|
#18+
> Поясните, Вы говорите о фильтрованном индексе или же нет, если нет, > то каков по Вашему размер индеса по deleted() для 5-ти записей для таблы в > 1млн записей, из вышесказанного он получается размером с исходную таблицу Я говорю про НЕФИЛЬТРОВАННЫЙ индекс. Про фильтрованный вообще есть смысл говорить только в очень ограниченной категории применения. А нефильтрованный - он строится для КАЖДОЙ записи, неважно удалена она или нет. Есть два значения .f. и .t. И то и другое - ЗНАЧЕНИЯ. Поэтому при кол-ве записей = 1 млн. говорить о "размере индеса по deleted() для 5-ти записей" несколько неправильно По размерам индекс зачастую занимает меньший размер чем данные в таблице, а вот про delete - не уверен (Даже скорее наоборот - больше, при чем в несколько раз. Т.к. индекс - это ДВУНАПРАВЛЕННЫЙ массив и в индексном файле хранится не только значение (скорее всего в обработанном виде) но и ссылка как на предыдущий элемент массива, так и на следующий). Документации по внутреннему устройству индексных файлов VFP не видел и даже не слышал, что это где-то есть. А то что поиск идет по индексам намного быстрее - так это не зависит от размера индекса. Это зависит от его внутренней организации. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2008, 13:09 |
|
||
|
неполучается запрос с подсчетом колличества одних и других :(
|
|||
|---|---|---|---|
|
#18+
> из вышесказанного он получается размером с исходную таблицу Fox не скачивает всю запись - он скачивает значение только тех полей, которые необходимо проверить на соответствие условию. Так вот скачать ТОЛЬКО нужные столбцы и их проверить при малом количестве ОТКИДЫВАЕМЫХ (не соответсвующих условиям выборки) записей по времени гораздо эффективнее чем скачивать весь индекс (ТЭГ, а не весь индексный файл). Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2008, 13:13 |
|
||
|
неполучается запрос с подсчетом колличества одних и других :(
|
|||
|---|---|---|---|
|
#18+
раньше где то баловался с индексами на дел. Базу увеличилвал в 100 раз и производил последовательно 10 запросов с подсчетом времени (макс.мин. и средн). Так вот, на разных таблицах, индекс по дел. влиял по разному, либо увеличивал время запроса, либо ни как значимо не влиял, либо уменьшал время запроса. Где то видел статьи о том, как использовать индексы, когда стоит их создавать, а когда нет, с разными формулами рассчетов. Так что ИМХО можно и эмпирическим путем подобрать, хотя основы все же знать необходимо ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2008, 17:21 |
|
||
|
неполучается запрос с подсчетом колличества одних и других :(
|
|||
|---|---|---|---|
|
#18+
Galyamov RinatДокументации по внутреннему устройству индексных файлов VFP не видел и даже не слышал, что это где-то есть. В архиве описание формата DBF/FPT/DBT/IDX/CDX - файлов Что касается индекса по Deleted() - однажды пытался оптимизировать один серьёзный запрос из 5-ти табличек (три более 100 тыс.записей) при отсутствии помеченных на удаление получил незначительное замедление при наличии индекса по deleted(), хотя Sys(3054, 11) начинал показывать FULL вместо NONE. В итоге пришел к выводу что к тяжелым запросам надо подходить индивидуально, и возможно в процессе работы вести предподготовку данных для его ускорения, если запрос часто используется. Galyamov RinatFox не скачивает всю запись - он скачивает значение только тех полей, которые необходимо проверить на соответствие условию. Проверяется элементарно. Есть таблица Katalog(nKatalogId i, cKatalog c(100), ...), заголовок 424 байта (функция HEADER()), длина одной записи 206 байт (функция RECSIZE()) запускается FILEMON.EXE c фильтром *KATALOG.DBF* делается запрос: Код: plaintext И результат: Смещение и объем считанного Номера записейOffset: 103218 Length: 618 499-501 записиOffset: 103836 Length: 1236 502-507 записиOffset: 123818 Length: 618 599-601 записи Фокс читает в данном случае по три и более записей. Думаю это связано с особенностями работы файловой системы. Попробуй FREAD() побайтно прогнать файл и большими кусками. Скорость в разы меняется. Поэтому быстрее получается немного лишнего прочитать из файла, но за раз, чем много раз только нужное дергать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2008, 18:37 |
|
||
|
неполучается запрос с подсчетом колличества одних и других :(
|
|||
|---|---|---|---|
|
#18+
На всякий случай замечу, что в VFP9 введен новый тип индексов для логических выражений - BINARY Типы индексов Visual FoxPro В этой статье приведена цифра 3%. Но значение в 3% относится только к бинарным индексам. Для "обычных" индексов граничное значение будет другим. В зависимости от конкретной ситуации. Описание структуры разных типов файлов можно посмотреть здесь Структуры файлов ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2008, 19:13 |
|
||
|
|

start [/forum/topic.php?fid=41&msg=35274036&tid=1587841]: |
0ms |
get settings: |
10ms |
get forum list: |
18ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
70ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
83ms |
get tp. blocked users: |
2ms |
| others: | 243ms |
| total: | 450ms |

| 0 / 0 |
