ABC анализ на H2 и MysqL с использованием переменных
Обнаружив практически одинаковый синтаксис в СУБД H2 и Mysql я решил написать ABC анализ на SQL с использованием переменных. Мне еще удалось обнаружить и отличия в логике запроса с переменными (смотри скрипт “Различия”).
Создадим таблицу для примера.
CREATE TABLE test.abc_data ( product_name varchar(20), sum_sale numeric(14,2) ); insert into test.abc_data values (1, 15429930), (2, 13497652), (3, 12796790), (4, 12209909), (5, 12209909), (6, 11529588), (7, 10942376), (8, 7166437), (9, 2730968);
Сам скрипт, который делает ABC анализ:
set @total=0; select PRODUCT_NAME, SUM_SALE , total/@total as abc, case when total/@total < 0.8 then 'A' when total/@total > 0.95 then 'C' else 'B' end as krit from ( SELECT *, @total:= @total + SUM_SALE as total FROM abc_data order by sum_sale DESC ) as t;
Результат работы в разных СУБД.
Mysql
H2
Однако другой скрипт будет работать по разному для разных СУБД. Это для домашних экспериментов.
Скрипт “Различия” в использовании переменных.
select PRODUCT_NAME, SUM_SALE , total/@total as abc, case when total/@total < 0.8 then 'A' when total/@total > 0.95 then 'C' else 'B' end as krit from ( SELECT *, @total:= @total + SUM_SALE as total FROM abc_data, (select @total:=0) AS z order by sum_sale DESC ) as t;
Можно отметить, что H2 умеет имитировать поведение других СУБД. Конечно, о полной совместимости говорить не приходится, но все же.
Ссылки на материалы:
- FAQ: Нумерация строк и другие вопросы про использование переменных http://www.sql.ru/forum/684431/faq-numeraciya-strok-i-drugie-voprosy-pro-ispolzovanie-peremennyh
- Is there a way to run MySQL in-memory for JUnit test cases? http://stackoverflow.com/questions/6734410/is-there-a-way-to-run-mysql-in-memory-for-junit-test-cases/14153007#14153007
- Features http://www.h2database.com/html/features.html
- Подробности
- Опубликовано: 05 Сентябрь 2014
- Просмотров: 3593