Подскажите пожалуйста по сортировке и группировке

Iber
Дата: 13.12.2012 14:27:06
Есть исходня таблица

CODE SHOP TYPESHOP COUNT P1 P2 PRICE
1 4 t1 14 4 10 453,2
1 26 t1 14 4 10 716,83
1 683 t2 14 4 10 264,07
1 9 t2 10 1 9 1163,79
1 17 t2 10 1 9 1025,19
1 58 t2 10 0 10 3289,08
1 18 t2 10 0 10 3811,91
1 47 t2 10 0 10 5220,86
1 55 t2 10 0 10 6064,07
1 7 t2 10 1 9 1004,96
1 71 t2 8 0 8 4161,82
1 2 t2 8 0 8 3346,88
1 36 t3 2 0 2 5415,11
2...

Надо отсортировать следующим образом: по Code и TYPESHOP, а внутри каждого TYPESHOPE по Shop asc и Count desc, но так чтобы shop'ы с совпадающими count+p1+p2 шли друг за другом. По сути order by code, typeshop, count desc, p1, p2, shop, Но тут всплыло еше одно важное условие( нужно чтобы группы shop'ов внутри TYPESHOP cостоящие из строк с одинаковыми count+p1+p2, шли тоже в порядке возврастания.

Немного запутанно объяснил, поэтому прилагаю искомый результат


CODE SHOP TYPESHOP COUNT P1 P2 PRICE
1 4 t1 14 4 10 453,2
1 26 t1 14 4 10 716,83
1 683 t2 14 4 10 264,07
1 7 t2 10 1 9 1004,96
1 9 t2 10 1 9 1163,79
1 17 t2 10 1 9 1025,19
1 18 t2 10 0 10 3811,91
1 47 t2 10 0 10 5220,86
1 55 t2 10 0 10 6064,07
1 58 t2 10 0 10 3289,08
1 2 t2 8 0 8 3346,88
1 71 t2 8 0 8 4161,82
1 36 t3 2 0 2 5415,11
здесь видно, что в данном случае в группе t2 есть 4 подгруппы 683, 7-9-17, 18-47-55-58, 2 и есть верхний уровень сортировки по полю Count и дальше уже в ней группы с одинаковым Count (7-9-17, 18-47-55-58) тоже идут возврастанию.

прилагаю sql
select * from(select 1 CODE,  4 SHOP,  't1' TYPESHOP,  14 COUNT, 4 P1, 10 P2, 453.2 PRICE from dual union all
 select 1,  26,  't1',  14,  4,  10,  716.83 from dual union all
 select 1,  683,  't2',  14,  4,  10,  264.07 from dual union all
 select 1,  50,  't2',  10,  1,  9,  1163.79 from dual union all
 select 1,  51,  't2',  10,  1,  9,  1025.19 from dual union all
 select 1,  58,  't2',  10,  0,  10,  3289.08 from dual union all
 select 1,  18,  't2',  10,  0,  10,  3811.91 from dual union all
 select 1,  47,  't2',  10,  0,  10,  5220.86 from dual union all
 select 1,  55,  't2',  10,  0,  10,  6064.07 from dual union all
 select 1,  7,  't2',  10,  1,  9,  1004.96 from dual union all
 select 1,  71,  't2',  8,  0,  8,  4161.82 from dual union all
 select 1,  2,  't2',  8,  0,  8,  3346.88 from dual union all
 select 1,  36,  't3',  2,  0,  2,  5415.11 from dual) tmp
MazoHist
Дата: 13.12.2012 14:35:00
....пропущено....
order by code, typeshop, count desc, lpad(count,3,'0')||lpad(p1,3,'0')||lpad(p2,3,'0'), shop
Iber
Дата: 13.12.2012 14:53:38
MazoHist ваш вариант дает результат еквивалентный
order by code, typeshop, count desc, p1, p2, shop

в итоге сначала идет группа 18-47-55-58 и за ней 7-9-17. А надо по возврастанию.

и я немного опечатался(, часный случай в таблицах показал, но в sql не частный случай...

перепост

Есть исходня таблица

CODE	SHOP	TYPESHOP	COUNT	P1	P2	PRICE
1 4 t1 14 4 10 453,2
1 26 t1 14 4 10 716,83
1 683 t2 14 4 10 264,07
1 50 t2 10 1 9 1163,79
1 51 t2 10 1 9 1025,19
1 58 t2 10 0 10 3289,08
1 18 t2 10 0 10 3811,91
1 47 t2 10 0 10 5220,86
1 55 t2 10 0 10 6064,07
1 7 t2 10 1 9 1004,96
1 71 t2 8 0 8 4161,82
1 2 t2 8 0 8 3346,88
1 36 t3 2 0 2 5415,11
2...

Надо отсортировать следующим образом: по Code и TYPESHOP, а внутри каждого TYPESHOPE по Shop asc и Count desc, но так чтобы shop'ы с совпадающими count+p1+p2 шли друг за другом. По сути order by code, typeshop, count desc, p1, p2, shop, Но тут всплыло еше одно важное условие( нужно чтобы группы shop'ов внутри TYPESHOP cостоящие из строк с одинаковыми count+p1+p2, шли тоже в порядке возврастания.

искомый результат



CODE SHOP TYPESHOP COUNT P1 P2 PRICE
1 4 t1 14 4 10 453,2
1 26 t1 14 4 10 716,83
1 683 t2 14 4 10 264,07
1 7 t2 10 1 9 1004,96
1 50 t2 10 1 9 1163,79
1 51 t2 10 1 9 1025,19
1 18 t2 10 0 10 3811,91
1 47 t2 10 0 10 5220,86
1 55 t2 10 0 10 6064,07
1 58 t2 10 0 10 3289,08
1 2 t2 8 0 8 3346,88
1 71 t2 8 0 8 4161,82
1 36 t3 2 0 2 5415,11
здесь видно, что в данном случае в группе t2 есть 4 подгруппы 683, 7-50-51, 18-47-55-58, 2 и есть верхний уровень сортировки по полю Count и дальше уже в ней группы с одинаковым Count (7-50-51, 18-47-55-58) тоже идут возврастанию.

sql
select * from(select 1 CODE,  4 SHOP,  't1' TYPESHOP,  14 COUNT, 4 P1, 10 P2, 453.2 PRICE from dual union all
 select 1,  26,  't1',  14,  4,  10,  716.83 from dual union all
 select 1,  683,  't2',  14,  4,  10,  264.07 from dual union all
 select 1,  50,  't2',  10,  1,  9,  1163.79 from dual union all
 select 1,  51,  't2',  10,  1,  9,  1025.19 from dual union all
 select 1,  58,  't2',  10,  0,  10,  3289.08 from dual union all
 select 1,  18,  't2',  10,  0,  10,  3811.91 from dual union all
 select 1,  47,  't2',  10,  0,  10,  5220.86 from dual union all
 select 1,  55,  't2',  10,  0,  10,  6064.07 from dual union all
 select 1,  7,  't2',  10,  1,  9,  1004.96 from dual union all
 select 1,  71,  't2',  8,  0,  8,  4161.82 from dual union all
 select 1,  2,  't2',  8,  0,  8,  3346.88 from dual union all
 select 1,  36,  't3',  2,  0,  2,  5415.11 from dual) tmp
Iber
Дата: 13.12.2012 17:09:06
совсем непонятно описал?
--Eugene--
Дата: 13.12.2012 17:18:23
Iber,

[...] order by code, typeshop,  Shop asc, Count desc, count+p1+p2
может так?
--Eugene--
Дата: 13.12.2012 17:19:42
тоесть так
[...] order by code, typeshop,  Shop asc, count+p1+p2 desc
Iber
Дата: 13.12.2012 18:13:09
нет. так тоже не работает как нужно, мне кажется простым Order by здесь не обойтись. нужно разбить на группы по typeshop, За тем в них на подгруппы по count, p1, p2. И еше эти подгруппы отсортировать по Count, и если у каких либо подгрупп Count совпадает то вывести сначала те где первое значение Shop меньше - 7-50-51, 18-47-55-58 в данном случае
MazoHist
Дата: 13.12.2012 22:24:24
with t as (select 1 CODE,  4 SHOP,  't1' TYPESHOP,  14 COUNT, 4 P1, 10 P2, 453.2 PRICE from dual union all
 select 1,  26,  't1',  14,  4,  10,  716.83 from dual union all
 select 1,  683,  't2',  14,  4,  10,  264.07 from dual union all
 select 1,  50,  't2',  10,  1,  9,  1163.79 from dual union all
 select 1,  51,  't2',  10,  1,  9,  1025.19 from dual union all
 select 1,  58,  't2',  10,  0,  10,  3289.08 from dual union all
 select 1,  18,  't2',  10,  0,  10,  3811.91 from dual union all
 select 1,  47,  't2',  10,  0,  10,  5220.86 from dual union all
 select 1,  55,  't2',  10,  0,  10,  6064.07 from dual union all
 select 1,  7,  't2',  10,  1,  9,  1004.96 from dual union all
 --если я правильно понял задание, то изменение shop 7->27 
-- должно переместить  группу 27-50-51 после 18-47-55-58
 select 1,  71,  't2',  8,  0,  8,  4161.82 from dual union all
 select 1,  2,  't2',  8,  0,  8,  3346.88 from dual union all
 select 1,  36,  't3',  2,  0,  2,  5415.11 from dual
 order by 7) 
 select t2.* from (
  select t.*, first_value(shop) over (partition by p1, p2 order by shop) start_group
  from t
  )t2
  order by  code, typeshop, count desc, start_group, shop
Iber
Дата: 14.12.2012 09:28:05
MazoHist
...first_value(shop) over (partition by p1, p2 order by shop) start_group
  ....


Да спасибо это помоему то, что нужно. Только в партию нада наверное добавить еше TYPESHOP и Count.