订购具有特定参数的行

时间:2013-08-26 19:04:22

标签: mysql group-by

我将此表填写如下http://sqlfiddle.com/#!2/3736a/4,我正在尝试做的是下一个:

我在nom_agrupacion列中有n组名称(在本例中为4组名称:CAFE NESCAFE,CAFE LEGAL,CAFE INTERNA,null),我需要先使用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个因为null计数也作为组)然后带上每个组的第二行,依此类推得到像此

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;

我使用group by首先带来单个成本,然后带上单个nom_agrupacion,但它似乎只读取成本,如果我只使用nom_agrupacion组,它不会给我带有最高值的列costo行

任何帮助都将受到赞赏。

1 个答案:

答案 0 :(得分: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

好的,解释发生了什么。首先是子查询:

  1. 我们将表数据连接到我们使用空值初始化的变量 FROM bby_venta_co AS b JOIN (SELECT @row := 0, @nom := '') AS r
  2. 接下来我们将@nom设置为nom_agrupacion,但(null)会产生问题 (由于比较)所以如果值为NULL,我们使用COALESCE来使用字符串 NULL
  3. 如果(COALESCE(nom_agrupacion, 'NULL') = @nom)不是@nom,则
  4. nom_agrupacion会投弃false / 0(当然,由于COALESCE&我们再次使用(null) #39; S)
  5. 因此,这有效地创建了@row := (0 or 1) * @row + 1。所以我们不断增加1,除了@nom不等于nom_agrupacion的那一刻,这是nom_agrupacion发生变化的时刻,我们多了一次[0],重置计数器。所以我们现在有效地有一个子订单计数器,计算第二个订单的价格位置,即{/ 1}} 第一个订单中
  6. 单独运行子查询以更好地掌握上述内容。

    1. 最后,我们选择整体并按此costo_original订购(按价格位置'分组),然后选择'row'