2010-03-15 12 views
11

Me pregunto si existe una forma canónica de convertir datos de formato largo a gran formato en SQLite (¿es esa operación generalmente en el dominio de las bases de datos relacionales?). Traté de seguir this example para MySQL, pero supongo que SQLite no tiene la misma construcción IF ... ¡Gracias!SQLite de formato largo a ancho?

Respuesta

12

IF es una extensión de MySQL no estándar. Es mejor usar siempre CASE que es SQL estándar y funciona en todas las bases de datos compatibles, incluidos SQLite y MySQL (y MSSQL, Oracle, Postgres, Access, Sybase ... y así sucesivamente).

Aquí hay un ejemplo de cómo hacer la misma consulta con CASE:

SELECT  Country, 
      MAX(CASE WHEN Key = 'President' THEN Value ELSE NULL END) President, 
      MAX(CASE WHEN Key = 'Currency' THEN Value ELSE NULL END) Currency 
FROM  Long 
GROUP BY Country 
ORDER BY Country; 

Ésta es otra manera de representar la misma consulta utilizando une. Creo que esto es probablemente más eficiente, pero supone que solo hay un registro para cada valor de clave dentro de cada grupo (la versión CASE también lo hace, pero no dará lugar a filas adicionales si eso no es cierto, solo resultados poco predecibles).

SELECT 
    D.Country, 
    P.Value President, 
    C.Value Currency 
FROM 
    (
     SELECT DISTINCT Country 
     FROM Long 
    ) D 
      INNER JOIN 
    ( SELECT Country, Value 
     FROM Long 
     WHERE Key = 'President' 
    ) P 
      ON 
     D.Country = P.Country 
      INNER JOIN 
    ( SELECT Country, Value 
     FROM Long 
     WHERE Key = 'Currency' 
    ) C 
      ON 
     D.Country = C.Country 
ORDER BY 
    D.Country; 

Y para que conste, aquí está el DDL y datos de prueba que estaba usando:

CREATE TABLE Long (ID INTEGER PRIMARY KEY AUTOINCREMENT, Country TEXT, Key TEXT, Value TEXT); 

INSERT INTO Long VALUES (NULL, 'USA', 'President', 'Obama'); 
INSERT INTO Long VALUES (NULL, 'USA', 'Currency', 'Dollar'); 
INSERT INTO Long VALUES (NULL, 'China', 'President', 'Hu'); 
INSERT INTO Long VALUES (NULL, 'China', 'Currency', 'Yuan'); 
+1

muy útil !! Gracias, necesito más tiempo para asimilar tu segundo ejemplo, pero esto realmente amplía mi conocimiento de SQL. – hatmatrix

Cuestiones relacionadas