[VFP] Como pasar de Columnas a Filas

1,959 views
Skip to first unread message

ZeRoberto

unread,
Jul 6, 2014, 10:26:32 PM7/6/14
to publicesvfoxpro
Tengo una tabla así

Tabla Ventas
Precio    DECIMAL(10,2)
Descuento DECIMAL(10,2)
Importe    DECIMAL(10,2)

Precio Descuento Importe 
    10         5       5

Como puedo hacer para pasarlo a filas (mediante comando SQL)

Tabla Resultado
Nombre  CHAR(20)
Valor   DECIMAL(10, 2)

Nombre      Valor
Precio         10
Descuento       5
Importe         5

--
btnMyVideo.Click()

mpulla

unread,
Jul 6, 2014, 10:54:46 PM7/6/14
to publice...@googlegroups.com
Hola Ze Roberto.

Con Sql Server utiliza Pivot, supongo que MySql tiene algo parecido...

Saludos.
Mauricio

ZeRoberto

unread,
Jul 6, 2014, 11:02:19 PM7/6/14
to publicesvfoxpro
Hace tiempo, alguien del foro me dio un link hacia un ejemplo pero no lo encuentro. voy a seguir buscando

Saludos

maxriel

unread,
Jul 6, 2014, 11:03:08 PM7/6/14
to publice...@googlegroups.com
Suponiendo que lo quieres listar para un PK determinada se puede hacer algo así:

SELECT CAST('PRECIO' AS CHAR(15)) AS NOMBRE, CAST(PRECIO AS NUMERIC(15,2)) AS VALOR FROM VENTAS WHERE PK = m.pk
UNION
SELECT CAST('DESCUENTO' AS CHAR(15)) AS NOMBRE, CAST(DESCUENTO AS NUMERIC(15,2)) AS VALOR FROM VENTAS WHERE PK = m.pk
UNION
SELECT CAST('IMPORTE' AS CHAR(15)) AS NOMBRE, CAST(IMPORTE AS NUMERIC(15,2)) AS VALOR FROM VENTAS WHERE PK = m.pk

Saludos

ZeRoberto

unread,
Jul 6, 2014, 11:06:04 PM7/6/14
to publicesvfoxpro
@mpulla 

Encontre el link

Pero es filas a columnas yo busco a la inversa

Saludis



El 6 de julio de 2014, 21:54, 'mpulla' via Comunidad de Visual Foxpro en Español <publice...@googlegroups.com> escribió:

ZeRoberto

unread,
Jul 6, 2014, 11:08:27 PM7/6/14
to publicesvfoxpro
Bueno al final lo termine haciendo con un SP

BEGIN
  #Routine body goes here...
  DECLARE llDone BOOLEAN DEFAULT FALSE;
  DECLARE lnImporte, lnCosto, lnDescuento, lnUtilidad DECIMAL(10,3) DEFAULT 0;
  
  DECLARE dbResumen CURSOR FOR 
          SELECT SUM(c.Importe) Importe, SUM(c.Costo * c.Cantidad) Costo, 
                 SUM(c.Descuento) Descuento, SUM((c.Importe - (c.Costo * c.Cantidad)) - c.Descuento) Utilidad
                 FROM ventas a
                      LEFT JOIN kardex b ON a.KardexID = b.KardexID
                      LEFT JOIN kardex_lineas c ON a.KardexID = c.KardexID
                 WHERE c.Fecha = tdFecha;
  
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET llDone = TRUE;
 
  DROP TEMPORARY TABLE IF EXISTS dbBase;
  CREATE TEMPORARY TABLE dbBase (Leyenda Char(20), Valor Decimal(10,3));
  INSERT dbBase SET Leyenda = 'IMPORTE';
  INSERT dbBase SET Leyenda = 'COSTO';
  INSERT dbBase SET Leyenda = 'DESCUENTO';
  INSERT dbBase SET Leyenda = 'UTILIDAD';

  OPEN dbResumen;
  FETCH NEXT FROM dbResumen INTO lnImporte, lnCosto, lnDescuento, lnUtilidad;
  CLOSE dbResumen;
  IF NOT llDone THEN
     UPDATE dbBase SET Valor = lnImporte   WHERE Leyenda = 'IMPORTE';
     UPDATE dbBase SET Valor = lnCosto     WHERE Leyenda = 'COSTO';
     UPDATE dbBase SET Valor = lnDescuento WHERE Leyenda = 'DESCUENTO';
     UPDATE dbBase SET Valor = lnUtilidad  WHERE Leyenda = 'UTILIDAD';
  END IF;
  
  SELECT * FROM dbBase;
END

ZeRoberto

unread,
Jul 6, 2014, 11:09:24 PM7/6/14
to publicesvfoxpro
Lo que me preocupa es el CREATE TEMPORARY se pone lenta a veces.

Víctor Hugo Espínola Domínguez

unread,
Jul 6, 2014, 11:13:21 PM7/6/14
to publice...@googlegroups.com
Hola ZeRoberto

Por si alguna vez decides usar Sql server:

Saludos,
Víctor.
Lambaré - Paraguay.

ZeRoberto

unread,
Jul 6, 2014, 11:20:44 PM7/6/14
to publicesvfoxpro
Maxriel el problema con esa modalidad es que se recorre N veces la tabla para ir creando las lineas.

Gracias de todas maneras

Saludos

ZeRoberto

unread,
Jul 6, 2014, 11:23:20 PM7/6/14
to publicesvfoxpro
Gracias Hugo por la respuesta, si no leo tu mensaje no me doy cuenta que lo que quiero hacer es UNPIVOT TABLE

Saludos

ZeRoberto

unread,
Jul 6, 2014, 11:36:56 PM7/6/14
to publicesvfoxpro
Maxriel creo que la cosa va por primero hacer el resumen y sobre eso hacer el UNION ALL así no recorrería la tabla de ventas varias veces.


2014-07-06 22:03 GMT-05:00 maxriel <max...@gmail.com>:

Douglas Sánchez

unread,
Jul 7, 2014, 12:22:03 AM7/7/14
to publice...@googlegroups.com
Hola ZRoberto y porque no usas el Cross Tab de vfp, traes tus registros desde mysql, sql server u oracle y la consulta cruzada la haces en VFP.
esta envia un barra horizontal que ve el usuario el tiempo que esta puede dartar en crearse.

Saludes

Douglas
--
Ing. Douglas Sánchez Guillén
      Consultor Informatico
Claro: 505 88495476

Douglas Sánchez

unread,
Jul 7, 2014, 12:23:09 AM7/7/14
to publice...@googlegroups.com
Ups. digo Tardar en crearse.
D: :D :D

ZeRoberto

unread,
Jul 7, 2014, 12:24:47 AM7/7/14
to publicesvfoxpro
Gracias por el dato Douglas

Saludos

Luis Maria Guayan

unread,
Jul 7, 2014, 9:35:14 AM7/7/14
to publice...@googlegroups.com
Lo puedes hacer con el Asistente de Tablas Cruzadas que trae VFP (vfpxtab.prg), pero mucho mejor y como 10 veces mas rápido es la herramienta FastXTab de Alexander Golovlev que la descargas de http://www.universalthread.com/ViewPageNewDownload.aspx?ID=9944

Luis María Guayán
Tucumán, Argentina
_________________________
http://www.PortalFox.com
Nada corre como un zorro
_________________________

mpulla

unread,
Jul 7, 2014, 6:28:20 PM7/7/14
to publice...@googlegroups.com
Hola Ze Roberto..

Disculpas en realidad debería ser unpivot.

Mira este ejemplo

Saludos.
Mauricio

ZeRoberto

unread,
Jul 7, 2014, 6:49:33 PM7/7/14
to publicesvfoxpro
Interesante link y excelente ejemplo!!!

Gracias amigo.

Saludos
Reply all
Reply to author
Forward
0 new messages