Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 27-03-2018
dev2000 dev2000 is offline
Registrado
NULL
 
Registrado: mar 2018
Posts: 4
Poder: 0
dev2000 Va por buen camino
Trasponer Columnas y Filas en SQLite

Hola Amigos, no soy muy experto en sqlite, mi duda es q quiero trasponer Filas en Columnas, me explico, tengo la siguiente Tabla:

Código SQL [-]
CREATE TABLE Muestras_Analizadas (
    IDMuestra TEXT,
    TenorAu   DOUBLE,
    IDLab     INTEGER
);

con los siguiebtes datos:

Código SQL [-]
select * from muestras_analizadas

IDMuestra |TenorAu |IDLab
Sample-01 |4.5 |1
Sample-02 |3.8 |1
Sample-03 |1.3 |1
Sample-03 |3.5 |2
Sample-01 |6.5 |2
Sample-03 |1.2 |1
Sample-01 |8 |3

Pero yo quisiera que la consulta me arrojara algo asi:

IDMuestra |Lab1 |Lab2 |Lab3
Sample-01 |4.5 |6.5 |8
Sample-02 |3.8 |null |null
Sample-03 |1.3 |3.5 |1.2

En un intento por lograrlo hice el siguiente código:

Código SQL [-]
SELECT  Muestras_Analizadas.IDMuestra,      
        (case when Muestras_Analizadas.IDLab = 1 then Muestras_Analizadas.TenorAu end) as Lab1,
        (case when Muestras_Analizadas.IDLab = 2 then Muestras_Analizadas.TenorAu end) as Lab2,
        (case when Muestras_Analizadas.IDLab = 3 then Muestras_Analizadas.TenorAu end) as Lab3
FROM   Muestras_Analizadas 
WHERE  (Muestras_Analizadas.IDLab in (select distinct IDLab from  Muestras_Analizadas) )
ORDER BY IDMuestra;

PERO ME ARROJA EL SIGUIENTE REPORTE:
IDMuestra |Lab1 |Lab2 |Lab3
Sample-01 |4.5 |null |null
Sample-01 |null |6.5 |null
Sample-01 |null |null |8
Sample-02 |3.8 |null |null
Sample-03 |1.3 |null |null
Sample-03 |null |3.5 |null
Sample-03 |null |null |1.2

Y si agrego un GROUP BY IDMuestra justo antes del ORDER BY, me arroja lo siguiente
IDMuestra |Lab1 |Lab2 |Lab3
Sample-01 |null |null |8
Sample-02 |3.8 |null |null
Sample-03 |null |null |1.2

Asi q agradezco la ayuda q me puedan prestar, gracias!!

Última edición por Casimiro Notevi fecha: 28-03-2018 a las 03:48:36.
Responder Con Cita
  #2  
Antiguo 28-03-2018
Avatar de yusnerqui
yusnerqui yusnerqui is offline
Miembro
 
Registrado: mar 2004
Ubicación: Cuba
Posts: 679
Poder: 21
yusnerqui Va por buen camino
Mira a ver si te vale
Código SQL [-]
SELECT IDMuestra,
max(case when IDLab = 1 then TenorAu else 0 end  ) as Lab1,
max(case when IDLab = 2 then TenorAu else 0 end  ) as Lab2,
max(case when IDLab = 3 then TenorAu else 0 end  ) as Lab3
FROM Muestras_Analizadas
GROUP BY [IDMuestra]
saludos
__________________
Lo importante no es llegar primero, sino saber llegar.

Para que puedas llegar mejor lee la Guia de Estilo


Última edición por Casimiro Notevi fecha: 28-03-2018 a las 03:48:19.
Responder Con Cita
  #3  
Antiguo 28-03-2018
Avatar de mamcx
mamcx mamcx is offline
Moderador
 
Registrado: sep 2004
Ubicación: Medellín - Colombia
Posts: 3.927
Poder: 26
mamcx Tiene un aura espectacularmamcx Tiene un aura espectacularmamcx Tiene un aura espectacular
Esto te pasa porque son 2 condiciones, no 1, sobre las que esta el pivot.
Código SQL [-]

SELECT 
    IDMuestra,
   max (case when IDLab = 1 and IDMuestra = 'Sample-01'  then TenorAu end) as Lab1,
   max (case when IDLab = 2 and IDMuestra = 'Sample-01'  then TenorAu end) as Lab2,
   max (case when IDLab = 3 and IDMuestra = 'Sample-01'  then TenorAu end) as Lab3
FROM 
(
    SELECT 'Sample-01'  IDMuestra, 4.5  TenorAu, 1 IDLab
    UNION ALL
    SELECT 'Sample-01', 6.5, 2
    UNION ALL
    SELECT 'Sample-01', 8, 3
)a
GROUP BY IDMuestra
__________________
El malabarista.

Última edición por mamcx fecha: 28-03-2018 a las 05:21:30.
Responder Con Cita
  #4  
Antiguo 28-03-2018
Avatar de yusnerqui
yusnerqui yusnerqui is offline
Miembro
 
Registrado: mar 2004
Ubicación: Cuba
Posts: 679
Poder: 21
yusnerqui Va por buen camino
Thumbs up

Cita:
Empezado por mamcx Ver Mensaje
Esto te pasa porque son 2 condiciones, no 1, sobre las que esta el pivot.
Código SQL [-] SELECT IDMuestra, max (case when IDLab = 1 and IDMuestra = 'Sample-01' then TenorAu end) as Lab1, max (case when IDLab = 2 and IDMuestra = 'Sample-01' then TenorAu end) as Lab2, max (case when IDLab = 3 and IDMuestra = 'Sample-01' then TenorAu end) as Lab3 FROM ( SELECT 'Sample-01' IDMuestra, 4.5 TenorAu, 1 IDLab UNION ALL SELECT 'Sample-01', 6.5, 2 UNION ALL SELECT 'Sample-01', 8, 3 )a GROUP BY IDMuestra
No! Creo que esta solución solo debuelve una fila correspondiente a Sample-01
Código:
IDMuestra    Lab1    Lab2    Lab3
Sample-01    4.5       6.5       8
__________________
Lo importante no es llegar primero, sino saber llegar.

Para que puedas llegar mejor lee la Guia de Estilo

Responder Con Cita
  #5  
Antiguo 28-03-2018
dev2000 dev2000 is offline
Registrado
NULL
 
Registrado: mar 2018
Posts: 4
Poder: 0
dev2000 Va por buen camino
Gracias Yusnerki, me sirvió de ayuda, esta muy bién! Saludos!
Responder Con Cita
  #6  
Antiguo 28-03-2018
Avatar de mamcx
mamcx mamcx is offline
Moderador
 
Registrado: sep 2004
Ubicación: Medellín - Colombia
Posts: 3.927
Poder: 26
mamcx Tiene un aura espectacularmamcx Tiene un aura espectacularmamcx Tiene un aura espectacular
Cita:
Empezado por yusnerqui Ver Mensaje
No! Creo que esta solución solo debuelve una fila correspondiente a Sample-01
Código:
IDMuestra    Lab1    Lab2    Lab3
Sample-01    4.5       6.5       8
Porque solo tiene datos de Sample-01 como ejemplo...
__________________
El malabarista.
Responder Con Cita
  #7  
Antiguo 28-03-2018
dev2000 dev2000 is offline
Registrado
NULL
 
Registrado: mar 2018
Posts: 4
Poder: 0
dev2000 Va por buen camino
Cita:
Empezado por yusnerqui Ver Mensaje
Mira a ver si te vale
Código SQL [-]
SELECT IDMuestra,
max(case when IDLab = 1 then TenorAu else 0 end  ) as Lab1,
max(case when IDLab = 2 then TenorAu else 0 end  ) as Lab2,
max(case when IDLab = 3 then TenorAu else 0 end  ) as Lab3
FROM Muestras_Analizadas
GROUP BY [IDMuestra]
saludos
Asi funciona, claro en este ejemplo es obvio que se conoce el nro de Laboratorios, en este caso solo son 3, pero que tal cuando se desconoce el nro de Laboratorios?? xq la columna IDLab viene de la Tabla Laboratorios:

Código SQL [-]
CREATE TABLE Laboratorios (
    IDLab     INTEGER UNIQUE
                      PRIMARY KEY AUTOINCREMENT,
    Direccion TEXT
);

con los Datos:
IDLab| Direccion
1 |CARACAS
2 |MARACAIBO
3 |ANZOATEGUI

Y pudieran ser más, osea quisiera que la consulta fuese flexible de manera q el nro de columnas de Laboratorios (Lab1, Lab2,...,Labx) no los indique yo, si no q la consulta misma los lea de la Tabla Laboratorios, Saludos.

Última edición por Casimiro Notevi fecha: 28-03-2018 a las 19:59:51.
Responder Con Cita
  #8  
Antiguo 28-03-2018
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.257
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por dev2000 Ver Mensaje
.
Bienvenido a clubdelphi, como siempre aconsejamos a los nuevos, no olvides leer nuestra guía de estilo, gracias por tu colaboración


Recuerda poner los tags al código fuente, ejemplo:



Gracias
Responder Con Cita
  #9  
Antiguo 28-03-2018
Avatar de yusnerqui
yusnerqui yusnerqui is offline
Miembro
 
Registrado: mar 2004
Ubicación: Cuba
Posts: 679
Poder: 21
yusnerqui Va por buen camino
Cita:
pudieran ser más, osea quisiera que la consulta fuese flexible de manera q el nro de columnas de Laboratorios (Lab1, Lab2,...,Labx) no los indique yo, si no q la consulta misma los lea de la Tabla Laboratorios
Creo que debes cambiarte a SQLServer para usar transform, MySQL no lo soporta.
__________________
Lo importante no es llegar primero, sino saber llegar.

Para que puedas llegar mejor lee la Guia de Estilo

Responder Con Cita
  #10  
Antiguo 28-03-2018
dev2000 dev2000 is offline
Registrado
NULL
 
Registrado: mar 2018
Posts: 4
Poder: 0
dev2000 Va por buen camino
Cita:
Empezado por yusnerqui Ver Mensaje
Creo que debes cambiarte a SQLServer para usar transform, MySQL no lo soporta.
Recuerda q hablamos de SQLite
Responder Con Cita
  #11  
Antiguo 28-03-2018
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.257
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Echa un vistazo a group_concat
Aunque creo que con sqlite tienes virtualtablet
Responder Con Cita
  #12  
Antiguo 28-03-2018
Avatar de yusnerqui
yusnerqui yusnerqui is offline
Miembro
 
Registrado: mar 2004
Ubicación: Cuba
Posts: 679
Poder: 21
yusnerqui Va por buen camino
Cita:
Empezado por dev2000 Ver Mensaje
Recuerda q hablamos de SQLite
Ups, disculpa me falló el driver db jajaja, tampoco tenía referencias de que SQLite permita este tipo de operaciones, aunque ahora veo que Casimiro Notevi Te hace algunas recomendaciones interesantes, no obstante, te comento que cuando necesito hacer algo así, generalmente armo la consulta desde dephi, php u otro lenguaje que esté utilizando, hago un select dinstinct por el campo que representará las columnas y luego lo recorro armando un a consulta similar a la del ejemplo que te puse anteriormente.

Saludos.
__________________
Lo importante no es llegar primero, sino saber llegar.

Para que puedas llegar mejor lee la Guia de Estilo

Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Filas a Columnas amerika111 Firebird e Interbase 40 18-03-2015 21:08:52
Consulta de Filas y Columnas mjjj SQL 1 19-02-2010 23:24:36
Filas y Columnas pmcastilla Varios 2 07-12-2007 21:22:01
ocultar filas o columnas karla Servers 1 10-08-2006 21:03:18
Filas a columnas nightynvid MS SQL Server 0 31-05-2006 17:22:44


La franja horaria es GMT +2. Ahora son las 01:07:06.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi