我将此表填写如下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行
任何帮助都将受到赞赏。
答案 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
好的,解释发生了什么。首先是子查询:
FROM bby_venta_co AS b JOIN (SELECT @row := 0, @nom := '') AS r
@nom
设置为nom_agrupacion
,但(null)
会产生问题
(由于比较)所以如果值为NULL,我们使用COALESCE
来使用字符串 NULL (COALESCE(nom_agrupacion, 'NULL') = @nom)
不是@nom
,则nom_agrupacion
会投弃false / 0(当然,由于COALESCE
&我们再次使用(null)
#39; S)@row := (0 or 1) * @row + 1
。所以我们不断增加1,除了@nom
不等于nom_agrupacion
的那一刻,这是nom_agrupacion
发生变化的时刻,我们多了一次[0],重置计数器。所以我们现在有效地有一个子订单计数器,计算第二个订单的价格位置,即{/ 1}} 在第一个订单中单独运行子查询以更好地掌握上述内容。
costo_original
订购(按价格位置'分组),然后选择'row'
。