Tengo un problema con MySQL al crear una variable de contador SOrder basada en un orden establecido definido por order by. Estaba trabajando en MySQL 5.1 pero actualmente no en 5.7. La consulta original en 5.1 tenía el orden de las subconsultas y era aceptable para los estándares en ese entonces. En 5.7 con el modo only_full_group_by desactivado, agregué el orden por en el exterior, pero incluso cuando el orden por dentro de la subconsulta se comentó (o se ignoró de acuerdo con los estándares de SQL), generó SOrder como si fuera aleatorio pero no basado en Column Carrier, ANTERIOR, método de envío, modelo único.
SELECT Carrier, PRIOR, ShipMethod, GroupOrder, @row_no:=IF(@prev_val = ANY_VALUE(t.SingleModel), @row_no, @row_no + 1) AS 'SOrder', SingleModel, COUNT(t.SingleModel) AS 'SingleModelTotQty', @prev_val:=ANY_VALUE(t.SingleModel) FROM (SELECT CASE WHEN ANY_VALUE(W.hdr_user_defined_field18) LIKE '%Fedex%' THEN 'FEDEX' ELSE 'UPS' END AS 'Carrier', CASE WHEN ANY_VALUE(W.hdr_user_defined_field20) IN ('16' , '26', '45', '88', '96') OR ANY_VALUE(W.hdr_user_defined_field20) IN ('19' , '21', '22', '23', '24', '44', '76', '77', '78') THEN 'PRIOR' ELSE 'NORM' END AS 'PRIOR', CASE WHEN ANY_VALUE(W.hdr_user_defined_field20) IN ('88' , '96', '80', '97') OR ANY_VALUE(W.hdr_user_defined_field20) IN ('76' , '77', '78', '79') OR ANY_VALUE(W.`Ship-To Location`) != '' THEN 'S2S' ELSE 'S2H' END AS 'ShipMethod', CASE WHEN SUM(Quantity) = 1 THEN 'Single' WHEN SUM(Quantity) > 1 AND COUNT(`PO Number`) = 1 THEN 'Multiple' WHEN COUNT(`PO Number`) > 1 THEN 'Mixed' END AS 'GroupOrder', CASE WHEN SUM(Quantity) = 1 THEN `Supplier Item Nbr` WHEN SUM(Quantity) > 1 AND COUNT(`PO Number`) = 1 THEN ' ' WHEN COUNT(`PO Number`) > 1 THEN ' ' END AS 'SingleModel', `PO Number` AS 'PONUM', CASE WHEN SUM(Quantity) = 1 THEN ' ' ELSE SUM(Quantity) END AS 'QtyPerMulPO' FROM dropship.Walmart_FullPOs W WHERE ProcessedDate = CURDATE() - 5 GROUP BY `PO Number` **ORDER BY Carrier , PRIOR DESC , ShipMethod , GroupOrder DESC , SingleModel DESC** ) t, (SELECT @row_no:=0) x, (SELECT @prev_val:='') y WHERE GroupOrder = 'Single' GROUP BY Carrier , PRIOR , ShipMethod , SingleModel ORDER BY t.Carrier , t.PRIOR DESC , t.ShipMethod , t.GroupOrder DESC , t.SingleModel DESC Resultado
Hay un problema con su sql_mode .
A partir de MySQL 5.7.x, el modo sql predeterminado incluye ONLY_FULL_GROUP_BY . (Antes de 5.7.5, MySQL no detecta la dependencia funcional y ONLY_FULL_GROUP_BY no está habilitado de manera predeterminada).
ONLY_FULL_GROUP_BY : se rechazarán las consultas de agrupación no determinista
Para más detalles consulte la documentación de sql_mode
Método 1:
Compruebe el valor predeterminado de sql_mode:
SELECT @@sql_mode Elimine ONLY_FULL_GROUP_BY de la consola ejecutando la siguiente consulta:
SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));Método 2:
Acceda a phpmyadmin para editar su sql_mode