Funcion PIVOT para MySQL

33 views
Skip to first unread message

David Field

unread,
Feb 20, 2025, 5:52:16 PMFeb 20
to ADO Harbour
En MySQL o MariaDB no existe funcion para realizar un PIVOT, pero hay formas de hacerlo.

Aquí les va una funcion que regresa el query necesario para tener un recordset utilizando ADO provisto por este grupo.
/*
Function MySQL_Pivot( cSelect, On, cOperation, cFieldValue, cGroup )
cSelect = Instruccion SQL a ejecutar para el PIVOT
SELECT b.clave, b.descripción, MONTHNAME(a.fecha) AS mes, a.cantidad FROM movinv a
JOIN invent b ON b.claveInv = a.claveinv
WHERE YEAR(Fecha) = 2019
ON = Campo para realizar el pivot  (en este caso 'mes') debe ser de caracter
cOperation = operacion a realizar 'SUM' 'AVG' etc
cFieldValue = El campo que se usa para la operacion
cGroup = Campos de la agrupación (deben ser todos los del cSelect excepto el definido como ON y cFieldValue)
*/

Function MySQL_Pivot( cSelect, On, cOperation, cFieldValue, cGroup, cOrder )
Local i,cSql := "SELECT "+cGroup,  aOn

If HB_ISARRAY(On)
aOn := On
Else
aOn := GETROWS("SELECT DISTINCT "+On+" FROM ("+cSelect+") z ")[1]
Endif

If aOn[1] = NIL // no regreso resultados
cSql += " FROM ("+cSelect+") z  WHERE 1=2" // regresar 0 registros
Else
For i := 1 TO LEN(aOn)
cSql += ", "+cOperation
cSql += "(CASE WHEN "+On+" = '"
cSql += aOn[i]
cSql += "' THEN "
cSql += cFieldValue+" Else 0 END) AS "
cSql += aOn[i]+" "
Next
cSql += " FROM ("+cSelect+") z GROUP BY "+cGroup+if(!EMPTY(cOrder), " ORDER BY "+cOrder, "")
Endif
Return cSql

Saludos,
David Field

Sergio Castellari

unread,
Feb 21, 2025, 6:50:16 AMFeb 21
to ado-h...@googlegroups.com

Hola David! Como andan tus cosas? por acá todo OK

Pregunta de Ignorante: ¿Que es y para que sirve un PIVOT? ¿Podrías tirar algún ejemplo de uso en nuestros sistemas de facturación comercial?

Desde ya mil gracias!

Abrazos,

Sergio

--
Has recibido este mensaje porque estás suscrito al grupo "ADO Harbour" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a ado-harbour...@googlegroups.com.
Para ver este debate, visita https://groups.google.com/d/msgid/ado-harbour/eefd2bbe-ff44-43b6-8dfa-149ba4deb2e3n%40googlegroups.com.

Libre de virus.www.avg.com

David Field

unread,
Feb 21, 2025, 1:26:24 PMFeb 21
to ADO Harbour
Hola Sergio,

El PIVOT te permite darle la vuelta a un query... reorganizar la información.
Por ejemplo:
Tienes tabla con datos de facturación y quieres presentar un reporte anual por mes de cada producto que se vea algo como
Clave         Descripcion                Enero   Febrero   Marzo ... etc
ABC_123  Articulo de prueba      120        100        105

Tu tabla contiene los datos para hacerlo pero el query
select clave, descripcion, MONTHNAME(fecha) as mes, sum(cantidad) from ... group by clave, descripcion, MONTHNAME(fecha)
te va a regresar un registro para cada artículo y cada mes.
ABC_123, Articulo de prueba, Enero,120
ABC_123, Articulo de prueba. Febrero, 100
etc...

El PIVOT te sirve para que te regrese un registro por cada artículo con campos de todos los meses y los valores del campo será la sumatoria de las cantidades.
Campo        Valor
Clave           ABC_123
Desripcon  Articulo de prueba
Enero          120
Febrero       100
Marzo          105
etc...

Saludos,
David Field

Sergio Castellari

unread,
Feb 21, 2025, 5:10:55 PMFeb 21
to ado-h...@googlegroups.com

EXCELENTE explicación!!!!

De hecho en mi sistema tengo algunas opciones estadísticas de facturación, incluido de artículos/productos, en donde hice la consulta como lo indicas primero (mas un campo nombre para facilitar luego su ordenamiento).

Este concepto ahorra muuuucho trabajo de codigo posterior!.

Muchas gracias por tu aporte!!!

Abrazos,

Sergio

Reply all
Reply to author
Forward
0 new messages