2010-03-15 5 views
11

Je me demande s'il existe une façon canonique de convertir des données de format long en format large dans SQLite (cette opération est-elle habituellement dans le domaine des bases de données relationnelles?). J'ai essayé de suivre this example pour MySQL mais je suppose que SQLite n'a pas la même construction IF ... Merci!SQLite longs à larges formats?

Répondre

12

IF est une extension MySQL non standard. Il est préférable de toujours utiliser CASE qui est standard SQL et fonctionne dans toutes les bases de données compatibles, y compris SQLite et MySQL (et MSSQL, Oracle, Postgres, Access, Sybase ... et ainsi de suite).

Voici un exemple de la façon de faire la même requête avec 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; 

Voici une autre façon de représenter la même requête avec des jointures. Je pense que cela est probablement plus efficace, mais il suppose qu'il n'y a qu'un seul enregistrement pour chaque valeur de clé dans chaque groupe (la version CASE aussi, mais n'aboutira pas à des lignes supplémentaires si ce n'est pas vrai, juste des résultats moins prévisibles).

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; 

pour le compte rendu, voici le DDL et les données de test que j'utilisais:

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

Très utile !! Merci - J'ai besoin de plus de temps pour enrichir votre deuxième exemple mais cela élargit vraiment mes connaissances SQL! – hatmatrix