2010-03-15 7 views
11

Интересно, есть ли канонический способ преобразования данных из длинного в широкий формат в SQLite (эта операция обычно выполняется в области реляционных баз данных?). Я пытался следовать за this example для MySQL, но я думаю, что SQLite не имеет такой же конструкции IF ... Спасибо!SQLite длинный до широкого формата?

ответ

12

IF является нестандартным расширением MySQL. Лучше всегда использовать CASE, который является стандартным SQL и работает во всех совместимых базах данных, включая SQLite и MySQL (и MSSQL, Oracle, Postgres, Access, Sybase ... и далее и далее).

Вот пример того, как сделать такой же запрос с 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; 

Вот еще один способ представить тот же запрос с использованием соединения. Я думаю, что это, вероятно, более эффективно, но предполагает, что в каждой группе есть только одна запись для каждого значения ключа (версия CASE тоже делает это, но не приведет к дополнительным строкам, если это не так, только результаты, которые меньше, чем предсказуемы).

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; 

И для записи, вот DDL и данные тестирования я использовал:

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

Очень полезно !! Спасибо. Мне нужно больше времени, чтобы проверить второй пример, но это действительно расширяет мои знания SQL! – hatmatrix

Смежные вопросы