Страницы: 1
RSS
Сводная с помощью SQL, запрос из MySQL в Excel
 
Доброго времени суток! По работе нужно анализировать списание материалов, т.е. сравнивать с плановым, в принципе все получилось кроме сводной таблицы. Раньше делал через сводную на VBA для этих целей был лишний лист и работало подольше. Чтобы обойтись без этих маневров решил подтянуть SQL :) Установил OpenServer и путем долгих проб и ошибок (и рысканья по интернету) нашел решение.
Код
SELECT GR_PR, KOD_PR, NAIM, LPAD(GRKD_PR,7,0), PRIZN, GR_B, KOD_B, NAIMB,
SUM(IF(TIP='norm',KOL_B,0)) AS Plan_kol,
SUM(IF(TIP='norm',SUM_B,0)) AS Plan_Sum,
SUM(IF(TIP='fact',KOL_B,0)) AS Fact_kol,
SUM(IF(TIP='fact',SUM_B,0)) AS Fact_Sum
FROM INTERtoPS GROUP BY GR_PR, KOD_PR, GRKD_PR, NAIM, PRIZN, GR_B, KOD_B ORDER BY GR_PR, KOD_PR, PRIZN, GR_B, KOD_B;

Решение полностью рабочее но приходится экспортировать лист в csv потом затягивать в таблицу БД потом выполнять запрос и обратно в Excel. Согласен получается не быстрей чем если бы на отдельном листе через VBA пропустил через сводную, но я борюсь с лишними листами, добиваюсь быстроты работы (в оригинале строк может быть свыше 10 тыс) ну и стремлюсь к лаконичности )

В итоге просьба: подскажите пожалуйста как написать данный запрос в Excel или как с помощью SQL добиться нужного результата другим способом? в прилагаемом файле лист "дано" "надо".
Еще есть лист "PS" он дублирует лист "надо" но уже с итогом, на очереди там макрос GetpoTipy (используются словари) но он работает только с "семизначными" (раньше он работал по ключу где всегда было 7 знаков), а сейчас я решил сделать по коду там разное количество цифр, а как я год назад его "лепил" уже не могу вспомнить так как тоже откуда то стырил), если будет возможность помогите и с этим, чтоб в запросе не использовать LPAD и не добивать сначала нолями, а то Excel ругается.
Заранее благодарен.
 
Можно создать запрос к БД и вывести результат сразу в сводную таблицу (вкладка Данные - из Microsoft Quwery)
 
Спасибо за ответ, но я бы хотел не выходить за рамки файла, БД создавал специально для экспериментов с SQL с полным функционалом так как в Excel не получалось написать правильный запрос. А так мне БД вообще не нужна по сути, надо еще научится тащить данные с DBF файлов не открывая но это уже совсем другая история :)
 
Доброе время суток
Цитата
Дмитрий Тарковский написал: научится тащить данные с DBF файлов
И это тоже можно делать при помощи MS Query. DBF - это тоже формат файлов БД, правда этот формат используют (точнее использовали) несколько "движков" БД.
 
Хорошо, можно ли делать запрос MS Query с помощью макроса? так как у меня порядка 10 макросов которые один за одним запускаются и переформатируют, добавляют, вычисляют данные для того чтоб придать им тот вид который мне надо в итоге. То есть выполнить 5 макросов, а потом заморачиваться с MS Query чтоб потом опять выполнялись макросы не хочется, потому что результат сводной таблицы это не конечная цель. Про MS Query я конечно же знал, но практически не использовал, сейчас попробую, может те азы SQL что успел узнать помогут сделать запросик...
 
Цитата
Дмитрий Тарковский написал: Хорошо, можно ли делать запрос MS Query с помощью макроса?
Можно, варианты для Access и MS SQL Server приводил буквально вчера. Варианты строк подключения по типам БД можно посмотреть на The Connection Strings Reference (Если будете пользоваться кодом по ссылке - обратите внимание, что перед строкой подключения нужно писать OLEDB; или ODBC; в зависимости от типа драйвера). MS Query удобен для того, чтобы подсмотреть строку подключения (Вкладка "Данные" - Подключения - свойства - вкладка "Определение"). Тело SQL опять же можно поменять там же. Удобно ещё и тем, что можно обойтись и без макросов, можно сохранить подключение в файл и просто добавить потом в новую книгу. Опять же не нужно каждый раз выполнять макрос для получения данных. Просто нажать обновить или настроить автообновление.

Успехов.
 
Если не хотите использовать БД - SQL запросы можно делать и к данным на листе екселя с помощью ADODB.
 
Вот я и хочу в екселе сделать запрос как в первом посте, но в екселе (при использовании запроса SQL) не работает конструкция sum(if()).
 
Доброе время суток

Как делаете? Что не работает? Что пишет?
Ищете экстрасенсов или на буковках экономите?
 
Макрос сообщает об ошибке: "Неопределенная функция 'LPAD' в выражении", после удаления этой (не главной) функции выдает ошибку: "Неопределенная функция 'IF' в выражении" - по всей видимости SQL подключаемый к Excel не поддерживает данный синтаксис, я и спрашиваю как надо написать чтоб данный запрос работал в екселе? может как то по другому подключать вначале?

Залил файл с макросом, в котором с помощью SQL запроса (отрабатывающим в MySQL) пытаюсь сделать сводную таблицу переформатировав данные на листе INTERtoPS.
 
Замените IF на IIF
 
Спасибо! все оказалось как всегда гениально и просто)
 
Цитата
Сводная с помощью SQL, запрос из MySQL в Excel
Цитата
Установил OpenServer и путем долгих проб и ошибок (и рысканья по интернету) нашел решение.
А если открыть файл, то в коде
Код
cnStr = "Provider=Microsoft.ACE.OLEDB.12.0;"

То есть используется "движок" отличный от MySQL, следовательно не факт, что названия функций будут совпадать/присутствовать.
Поэтому и IIF вместо IF
А если бы строка подключения, например, была вида
Код
cnStr = "Driver={MySQL ODBC 5.2 UNICODE Driver};Server=localhost;Database=myDataBase;User=myUsername;Password=myPassword;Option=3;"
, то и менять запрос бы не пришлось (за исключением имён таблиц и полей, если разные).
Я же предполагал, что вы действительно выводите групповой вопрос в Excel с сервера MySQL. Поаккуратнее, на будущее с формулировками и привлечением не нужных сущностей.
Изменено: Андрей VG - 03.09.2015 19:37:02
 
Андрей VG  спасибо большое за ответ и помощь, в дальнейшем постараюсь выражаться яснее, а на этот раз простите дилетанта)
Страницы: 1
Читают тему
Наверх