Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQLite长到宽格式?_Sql_Sqlite_Rdbms - Fatal编程技术网

SQLite长到宽格式?

SQLite长到宽格式?,sql,sqlite,rdbms,Sql,Sqlite,Rdbms,我想知道在SQLite中是否有一种将数据从长格式转换为宽格式的规范方法(这种操作通常在关系数据库领域吗?)。我试着使用MySQL,但我猜SQLite没有相同的IF结构。。。谢谢 如果是非标准的MySQL扩展。最好始终使用CASE,它是标准SQL,适用于所有兼容的数据库,包括SQLite和MySQL(以及MSSQL、Oracle、Postgres、Access、Sybase等等) 下面是一个如何使用案例执行相同查询的示例: SELECT Country, MAX(

我想知道在SQLite中是否有一种将数据从长格式转换为宽格式的规范方法(这种操作通常在关系数据库领域吗?)。我试着使用MySQL,但我猜SQLite没有相同的IF结构。。。谢谢

如果
是非标准的MySQL扩展。最好始终使用
CASE
,它是标准SQL,适用于所有兼容的数据库,包括SQLite和MySQL(以及MSSQL、Oracle、Postgres、Access、Sybase等等)

下面是一个如何使用
案例执行相同查询的示例:

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
版本也有,但如果不是这样,则不会产生额外的行,只是比可预测的结果要少)

作为记录,这里是我使用的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');

作为对上述优秀答案的更新(这是一个可推广的解决方案),并参考OP中引用的,SQLite在3.32.0版中使用
IIF()
函数:

iif(X,Y,Z)

iif(X,Y,Z)
函数在X为真时返回值Y,否则返回值Z。
iif(X,Y,Z)
函数在逻辑上等价于并生成与CASE表达式相同的字节码
CASE,当X然后Y或者Z结束时

使用接受答案的DDL,执行以下查询:

SELECT Country,
    MAX( IIF(key='President', Value, NULL)) President,
    MAX( IIF(key='Currency', Value, NULL)) Currency
FROM Long
GROUP BY Country;
。。。应重塑长格式:

。。。对于宽幅格式:


在这里,我们已经转换了行和列。

非常有用!!谢谢-我需要更多的时间来研究你的第二个示例,但这确实扩展了我的SQL知识!
SELECT Country,
    MAX( IIF(key='President', Value, NULL)) President,
    MAX( IIF(key='Currency', Value, NULL)) Currency
FROM Long
GROUP BY Country;
┌────┬─────────┬───────────┬────────┐
│ ID │ Country │    Key    │ Value  │
├────┼─────────┼───────────┼────────┤
│ 1  │ USA     │ President │ Obama  │
│ 2  │ USA     │ Currency  │ Dollar │
│ 3  │ China   │ President │ Hu     │
│ 4  │ China   │ Currency  │ Yuan   │
└────┴─────────┴───────────┴────────┘

┌─────────┬───────────┬──────────┐
│ Country │ President │ Currency │
├─────────┼───────────┼──────────┤
│ China   │ Hu        │ Yuan     │
│ USA     │ Obama     │ Dollar   │
└─────────┴───────────┴──────────┘