12


7

SQLiteのロングフォーマットからワイドフォーマットまで?

SQLiteでデータを長い形式から広い形式に変換する標準的な方法があるのだろうか(通常、リレーショナルデータベースのドメインでの操作ですか?)。 私はhttps://stackoverflow.com/questions/2255640/mysql-reshape-data-from-long-tall-to-wide [この例]をMySQLにしようとしましたが、SQLiteには同じIFコンストラクトがないと思います。 。 ありがとうございます。

1 Answer


15


`IF`は非標準のMySQL拡張です。 標準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;

結合を使用して同じクエリを表す別の方法を次に示します。 これはおそらくより効率的だと思いますが、各グループ内の各キー値に対して1つのレコードしかないことを前提としています( `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');