consulta de vertical a horizontal

885 views
Skip to first unread message

Gilberth Grissom

unread,
Dec 15, 2015, 10:14:27 AM12/15/15
to publicesvfoxpro, mundovisualfoxpro
saludos a todos..

apelo nuevamente a su generosa ayuda para lo siguiente:

tengo una consulta en SQL Server cuyo resultado lo muestro en un formulario VFP..

el caso es el siguiente:

la consulta, permite obtener el stock de dos almacenes y lo muestra en resultado vertical:

SELECT ALMACEN, UPPER(NOMBRE) NOMBRE, UPPER(PRESENTACION) PRESENTACION, STOCK FROM V_STOCK  ORDER BY NOMBRE ASC


el resultado es como siguie:

ALMACEN  NOMBRE   PRESENTACION STOCK
-----------------------------------------------------------------------------
farmacia1     medicamento1      uni.    10
farmacia2     medicamento1      uid.       20
farmacia1     medicamento2      uni.      8
farmacia2      medicamento2     uni..     7 



y así para lo mas de 100 productos...se muestra el stock de ambas farmacias en vertical...


pero el usuario lo quiere tener en horizontal, es decir:

NOMBRE        PRESENTACION    STOCK1    STOCK2
----------------------------------------------------------------------------------------
medicamento1   unid.                         10                20  
medicamento2   uid.                            8                7


-----------------------------------------

intente hacerlo con el uso del PIVOT de esta manera:

SELECT NOMBRE, PRESENTACION, [0], [1] 
  FROM (SELECT NOMBRE, PRESENTACION FROM V_STOCK) AS nSTOCK1 
  PIVOT
  (
  NOMBRE FOR V_STOCK IN ([0], [1]) AS NSTOCK2)


no tuve exito...

espero su ayuda...


gracias


Grisson

Gilberth Grissom

unread,
Dec 15, 2015, 11:25:09 AM12/15/15
to publicesvfoxpro, mundovisualfoxpro
saludos amigos...

creo que ya lo solucione de esta manera:

SELECT nombre, presentacion,
       MAX( CASE almacen WHEN 'farmacia1' THEN stock ELSE 0 END ) stock1, 
       MAX( CASE almacen WHEN 'farmacia2' THEN stock ELSE 0 END ) stock2 
 FROM v_stock  GROUP BY nombre, PRESENTACION  order by NOMBRE asc
   

gracias 

grisson


--
Grissom

Erwin Vera (Gmail)

unread,
Dec 16, 2015, 7:25:02 PM12/16/15
to mundovis...@googlegroups.com

Original:

SELECT ALMACEN, UPPER(NOMBRE) NOMBRE, UPPER(PRESENTACION) PRESENTACION, STOCK FROM V_STOCK  ORDER BY NOMBRE ASC

Pudiera ser algo así:

 

SELECT UPPER(a.NOMBRE) NOMBRE, UPPER(a.PRESENTACION) PRESENTACION, (select sum(b.STOCK) as stock from V_STOCK as b where b.almacen='farmacia1' and b.fecha_mov <= '20151031') as stockfar1,(select sum(b.STOCK) as stock from V_STOCK as b where b.almacen='farmacia2' and b.fecha <= '20151031') as stockfar2

FROM <tabla de presentaciones> as a ORDER BY <a.NOMBRE> ASC

 

Donde coloqué la fecha como un tope para sólo incluir movimientos hasta una fecha, pero eso podría ser cualquier cosa que necesites estoy asumiendo que estás usando SQL y no tablas DBF, por lo que debiera funcionarte bien, pero lo ideal es que sean variables tipo fecha

 

Por otro lado y para que se cuiden de eso, cuando haces consultas directamente sobre las tablas de la BD SQL, vía sistema o vía consultas del Manager SQL, las tablas se bloquean por esa lectura, para evitar que esto les pase y bloqueen o detengan a los usuarios, o ellos mismos se bloqueen en sus consultas (y más si son muchos usuarios o mucha data), usen el parámetro (nolock), la consulta quedaría así:

SELECT UPPER(a.NOMBRE) NOMBRE, UPPER(a.PRESENTACION) PRESENTACION, (select sum(b.STOCK) as stock from V_STOCK as b (nolock) where b.almacen='farmacia1' and b.fecha_mov <= '20151031') as stockfar1,(select sum(b.STOCK) as stock from V_STOCK as b (nolock) where b.almacen='farmacia2' and b.fecha <= '20151031') as stockfar2

FROM <tabla de presentaciones> as a  (nolock) ORDER BY <a.NOMBRE> ASC

 

Ojo: no diste las tablas ni relaciones u otra cosa para poder ayudarte mejor, pero ésta, es una forma de resolverlo, eso sí, tu sistema debe contemplar algún tipo de cierre o algo parecido porque en el tiempo la cantidad de data de tus tablas de movimientos del inventario podrían llegar a ser descomunales

 

Cualquier cosa me escribes y te apoyo en lo posible

 

Saludos

--
_______________________________________________________________
Has recibido este mensaje porque estás suscrito al Grupo "Mundo Visual
FoxPro" de Grupos de Google.
 
Para anular la suscripción a este grupo, envía un mensaje a:
mundovisualfox...@googlegroups.com
---
Has recibido este mensaje porque estás suscrito al grupo "Mundo Visual FoxPro" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a mundovisualfox...@googlegroups.com.
Para acceder a más opciones, visita https://groups.google.com/d/optout.




Avast logo

El software de antivirus Avast ha analizado este correo electrónico en busca de virus.
www.avast.com


Erwin Vera (Gmail)

unread,
Dec 16, 2015, 7:28:35 PM12/16/15
to mundovis...@googlegroups.com

El ejemplo que envías en este mail, tiene el problema que las farmacias o almacenes si están en la misma tabla o vista del v_stock van a aparecer al menos dos veces, o sea farmacia1 y luego cuando aparezca la farmacia2 va a aparecer de nuevo por el GROUP BY, espero me haya sabido explicar

Saludos

 

De: mundovis...@googlegroups.com [mailto:mundovis...@googlegroups.com] En nombre de Gilberth Grissom


Enviado el: martes, 15 de diciembre de 2015 11:55
Para: publicesvfoxpro; mundovisualfoxpro

--

_______________________________________________________________
Has recibido este mensaje porque estás suscrito al Grupo "Mundo Visual
FoxPro" de Grupos de Google.
 
Para anular la suscripción a este grupo, envía un mensaje a:
mundovisualfox...@googlegroups.com
---
Has recibido este mensaje porque estás suscrito al grupo "Mundo Visual FoxPro" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a mundovisualfox...@googlegroups.com.
Para acceder a más opciones, visita https://groups.google.com/d/optout.

Reply all
Reply to author
Forward
0 new messages