2013-08-26 3 views
2

Я эта таблица заполнена следующим образом http://sqlfiddle.com/#!2/3736a/4, что я пытаюсь сделать это следующее:Заказать строки с определенными параметрами

У меня есть п группа имен (в данных случае 4 названий групп: КАФЕ Nescafe, КАФЕ LEGAL, CAFE INTERNA, null) из столбца nom_agrupacion, и мне нужно сначала отсортировать их по nom_agrupacion (название группы), а затем по другому столбцу, который является costo.

Запрос сделать это это

SELECT * FROM bby_venta_co WHERE promocion_id = 100000189 
AND ti = 153 
AND ffi = 12 
AND ci = 1 
ORDER BY nom_agrupacion DESC, costo DESC; 

и получить это

ID DTTI TI  FFI CI PROMOCION_ID CODIGO_BARRAS COSTO NOM_AGRUPACION 
53 1101 153  12 1 100000189  7501001602727 34.55 CAFE NESCAFE 
55 1102 153  12 1 100000189  7501001602727 34.55 CAFE NESCAFE 
62 1107 153  12 1 100000189  7501059224841 19.45 CAFE NESCAFE 
65 1108 153  12 1 100000189  17501052411115 28.3 CAFE LEGAL 
66 1109 153  12 1 100000189  17501052411115 28.3 CAFE LEGAL 
67 1110 153  12 1 100000189  7501052411118 24.8 CAFE LEGAL 
57 1103 153  12 1 100000189  7501052411118 24.8 CAFE LEGAL 
61 1106 153  12 1 100000189  17501052418732 55.6 CAFE INTERNA 
52 1100 153  12 1 100000189  27501052418739 32.6 CAFE INTERNA 
51 1099 153  12 1 100000189  27501052418739 32.6 CAFE INTERNA 
60 1105 153  12 1 100000189  7501052418520 19.35 CAFE INTERNA 
59 1104 153  12 1 100000189  7501000112388 12.9 (null) 
68 1111 153  12 1 100000189  7501000112388 12.9 (null) 

Но мне нужно сортировать информацию, так что я могу получить это: Принесите первую строку каждого имени группы (Я получил 4 балла по нулевой мере, как и группа), затем принесите вторую строку каждой группы и так далее, чтобы получить что-то вроде этого

ID DTTI TI  FFI CI PROMOCION_ID CODIGO_BARRAS COSTO NOM_AGRUPACION 
53 1101 153  12 1 100000189  7501001602727 34.55 CAFE NESCAFE 
66 1109 153  12 1 100000189  17501052411115 28.3 CAFE LEGAL 
61 1106 153  12 1 100000189  17501052418732 55.6 CAFE INTERNA 
59 1104 153  12 1 100000189  7501000112388 12.9 (null) 
55 1102 153  12 1 100000189  7501001602727 34.55 CAFE NESCAFE 
65 1108 153  12 1 100000189  17501052411115 28.3 CAFE LEGAL 
52 1100 153  12 1 100000189  27501052418739 32.6 CAFE INTERNA 
68 1111 153  12 1 100000189  7501000112388 12.9 (null)  
62 1107 153  12 1 100000189  7501059224841 19.45 CAFE NESCAFE 
57 1103 153  12 1 100000189  7501052411118 24.8 CAFE LEGAL 
51 1099 153  12 1 100000189  27501052418739 32.6 CAFE INTERNA 
60 1105 153  12 1 100000189  7501052418520 19.35 CAFE INTERNA 

Возможно ли это в одном запросе?

Я попытался, по крайней мере, принести первую строку каждой группы один раз, но мой запрос не работает должным образом:

SELECT * FROM bby_venta_co WHERE promocion_id = 100000189 
AND ti = 153 
AND ffi = 12 
AND ci = 1 
GROUP BY costo, nom_agrupacion 
ORDER BY nom_agrupacion DESC, costo DESC; 

Я использую группу, чтобы принести первую единую цену, а затем довести единую nom_agrupacion но кажется, что он только читает стоимость, и если я использую только группу по nom_agrupacion, это не приводит мне строки столбца costo с самыми высокими значениями.

Любая помощь будет оценена.

ответ

1

Это должно сделать трюк

SELECT * FROM (
    SELECT b.*, 
      @row := (COALESCE(nom_agrupacion, 'NULL') = @nom) * @row + 1 AS 'row', 
      @nom := COALESCE(nom_agrupacion, 'NULL') 
     FROM bby_venta_co AS b 
     JOIN (SELECT @row := 0, @nom := '') AS r 
     WHERE promocion_id = 100000189 and ticket_id = 153 and fondo_fijo_id = 12 and caja_id = 1 
     ORDER BY nom_agrupacion DESC, costo_original DESC 
) AS sub 
ORDER BY `row`, nom_agrupacion DESC 

Ok, объяснение того, что происходит. первый подзапрос:

  1. Мы присоединяемся данные таблицы для переменных, которые мы INIT с пустыми значениями FROM bby_venta_co AS b JOIN (SELECT @row := 0, @nom := '') AS r
  2. Затем мы устанавливаем @nom в nom_agrupacion, однако (null) «s дал бы проблему (за счетом сравнения), поэтому мы используем COALESCE использовать строку NULL, если значение NULL
  3. (COALESCE(nom_agrupacion, 'NULL') = @nom) будет отбрасывать ложные/0, если @nom не nom_agrupacion (конечно, мы еще раз должны использовать COALESCE за счет (null) 's)
  4. Таким образом, это эффективно создает @row := (0 or 1) * @row + 1. Таким образом, мы непрерывно увеличиваем на 1, за исключением момента @nom не равен nom_agrupacion, то есть когда nom_agrupacion изменяется, в этот момент мы мульти [ply с 0, сбросив счетчик. Таким образом, мы теперь фактически есть счетчик подотряда, считая ценовую позицию 2-го порядка, то есть costo_originalв первого порядка

Просто запустите подзапрос отдельно, чтобы получить лучшее сцепление выше.

  1. Наконец, мы выбираем целое и заказ по этой 'row' (группировка по «ценовой позиции»), а затем nom_agrupacion.
+0

Многое большое спасибо. Не могли бы вы объяснить запрос только для уточнения, потому что я понятия не имею, что вы там делали. – Blackmore

+2

Добавлено объяснение сообщения, поскольку это было немного долго, надеюсь, что это поможет. – vollie

+0

Это действительно помогло, еще раз спасибо за объяснение. – Blackmore

Смежные вопросы