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

Mysql result

H2

h2 result

Однако другой скрипт будет работать по разному для разных СУБД. Это для домашних экспериментов.

Скрипт “Различия” в использовании переменных.

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 умеет имитировать поведение других СУБД. Конечно, о полной совместимости говорить не приходится, но все же.

Ссылки на материалы:

  1. FAQ: Нумерация строк и другие вопросы про использование переменных http://www.sql.ru/forum/684431/faq-numeraciya-strok-i-drugie-voprosy-pro-ispolzovanie-peremennyh
  2. 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
  3. Features http://www.h2database.com/html/features.html