2

我有这个表填写如下http://sqlfiddle.com/#!2/3736a/4,我想做的是下一个:

我有来自 nom_agrupacion 列的 n 组名称(在本例中为 4 个组名称:CAFE NESCAFE、CAFE LEGAL、CAFE INTERNA、null),我需要先按 nom_agrupacion(组名称)对它们进行排序,然后再按其他列是科斯托。

这样做的查询是这样的

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 但它似乎只读取成本,如果我只使用 group by nom_agrupacion 它不会给我带来具有最高值的列 costo 的行。

任何帮助将不胜感激。

4

1 回答 1

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. 接下来我们设置@nomnom_agrupacion,但是(null)'s 会给出一个问题(由于比较)所以我们使用COALESCE字符串NULL如果值为 NULL
  3. (COALESCE(nom_agrupacion, 'NULL') = @nom)@nom如果不是,将强制转换为 false / 0 (当然,由于's nom_agrupacion,我们再次必须使用)COALESCE(null)
  4. 所以这有效地创建了@row := (0 or 1) * @row + 1. 所以我们不断地增加 1,除了时刻@nom不等于nom_agrupacion,这是当我们乘以nom_agrupacion0 时发生变化,重置计数器。所以我们现在有效地有一个子订单计数器,计算第二个订单的价格位置,即costo_original 第一个订单内

只需单独运行子查询即可更好地掌握上述内容。

  1. 最后,我们选择整体并按此排序'row'(按“价格位置”分组),然后按nom_agrupacion.
于 2013-08-26T19:30:48.583 回答