Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Trasponer Columnas y Filas en SQLite (https://www.clubdelphi.com/foros/showthread.php?t=92959)

dev2000 27-03-2018 22:39:57

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!!

yusnerqui 28-03-2018 01:08:15

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

mamcx 28-03-2018 04:07:13

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

yusnerqui 28-03-2018 05:18:52

Cita:

Empezado por mamcx (Mensaje 525374)
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

:confused::confused::confused: 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


dev2000 28-03-2018 16:02:05

Gracias Yusnerki, me sirvió de ayuda, esta muy bién! Saludos!

mamcx 28-03-2018 18:05:46

Cita:

Empezado por yusnerqui (Mensaje 525375)
:confused::confused::confused: 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...

dev2000 28-03-2018 18:35:53

Cita:

Empezado por yusnerqui (Mensaje 525373)
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.

Casimiro Notevi 28-03-2018 18:59:24

Cita:

Empezado por dev2000 (Mensaje 525403)
.

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 :)

yusnerqui 28-03-2018 19:01:09

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.

dev2000 28-03-2018 19:04:23

Cita:

Empezado por yusnerqui (Mensaje 525406)
Creo que debes cambiarte a SQLServer :) para usar transform, MySQL no lo soporta.

Recuerda q hablamos de SQLite

Casimiro Notevi 28-03-2018 19:08:35

Echa un vistazo a group_concat
Aunque creo que con sqlite tienes virtualtablet

yusnerqui 28-03-2018 20:27:29

Cita:

Empezado por dev2000 (Mensaje 525408)
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.


La franja horaria es GMT +2. Ahora son las 17:02:42.

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