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