问题 SQLite长到宽格式?


我想知道在SQLite中是否存在将数据从长格式转换为宽格式的规范方法(该操作通常在关系数据库的域中吗?)。我试着跟着 这个例子 对于MySQL但我猜SQLite没有相同的IF构造...谢谢!


8885
2018-03-15 02:15


起源



答案:


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');

14
2018-03-16 02:50



很有帮助!!谢谢 - 我需要更多时间来修改你的第二个例子,但这确实扩展了我的SQL知识! - hatmatrix


答案:


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');

14
2018-03-16 02:50



很有帮助!!谢谢 - 我需要更多时间来修改你的第二个例子,但这确实扩展了我的SQL知识! - hatmatrix