在 SQLite 中组合两列的巧妙方法?
Clever way of combining two columns in SQLite?
很抱歉,如果这感觉像代码高尔夫,但我试图避免从数据库中获取数据,在应用程序代码中处理一些需要在数据集上进行 slooow 循环的事情,其中有索引会帮忙分组。
有没有办法从这样的数据集中获取:
sqlite> create table tst (id INTEGER, label TEXT, variable TEXT, value FLOAT);
sqlite> insert into tst values (1,"label1","variable 1",1.2);
sqlite> insert into tst values (1,"label2","variable 2",2.2);
sqlite> insert into tst values (1,"label3","variable 3",3.2);
sqlite> select * from tst;
id label variable value
---------- ---------- ---------- ----------
1 label1 variable 1 1.2
1 label2 variable 2 2.2
1 label3 variable 3 3.2
将像这样返回(输出列的名称由 variable
和 label
列的内容构成):
sqlite> <magic query here>
id label1_variable1 label2_variable2 label3_variable3
---------- ---------- ---------- ----------
1 1.2 2.2 3.2
也就是说,宽格式而不是长格式?
请指教,或者通过证明这是不可能的来帮助我。
您可以使用数据透视查询实现此目的:
SELECT id,
SUM(CASE WHEN label = 'label1' THEN value ELSE 0 END) AS 'label1_variable1',
SUM(CASE WHEN label = 'label2' THEN value ELSE 0 END) AS 'label2_variable2',
SUM(CASE WHEN label = 'label3' THEN value ELSE 0 END) AS 'label3_variable3'
FROM tst
GROUP BY id
您不能在 SQLite 中使用一组未知的列执行数据透视查询,因为这样做需要动态 SQL。作为用户@CL。在他下面的评论中提到,模拟动态 SQL 的一种方法是首先执行 SELECT DISTINCT label FROM tst
以获得所有列的集合,然后进行类似于我上面给出的数据透视查询。您必须从您的应用程序层以编程方式构建数据透视查询。
很抱歉,如果这感觉像代码高尔夫,但我试图避免从数据库中获取数据,在应用程序代码中处理一些需要在数据集上进行 slooow 循环的事情,其中有索引会帮忙分组。
有没有办法从这样的数据集中获取:
sqlite> create table tst (id INTEGER, label TEXT, variable TEXT, value FLOAT);
sqlite> insert into tst values (1,"label1","variable 1",1.2);
sqlite> insert into tst values (1,"label2","variable 2",2.2);
sqlite> insert into tst values (1,"label3","variable 3",3.2);
sqlite> select * from tst;
id label variable value
---------- ---------- ---------- ----------
1 label1 variable 1 1.2
1 label2 variable 2 2.2
1 label3 variable 3 3.2
将像这样返回(输出列的名称由 variable
和 label
列的内容构成):
sqlite> <magic query here>
id label1_variable1 label2_variable2 label3_variable3
---------- ---------- ---------- ----------
1 1.2 2.2 3.2
也就是说,宽格式而不是长格式?
请指教,或者通过证明这是不可能的来帮助我。
您可以使用数据透视查询实现此目的:
SELECT id,
SUM(CASE WHEN label = 'label1' THEN value ELSE 0 END) AS 'label1_variable1',
SUM(CASE WHEN label = 'label2' THEN value ELSE 0 END) AS 'label2_variable2',
SUM(CASE WHEN label = 'label3' THEN value ELSE 0 END) AS 'label3_variable3'
FROM tst
GROUP BY id
您不能在 SQLite 中使用一组未知的列执行数据透视查询,因为这样做需要动态 SQL。作为用户@CL。在他下面的评论中提到,模拟动态 SQL 的一种方法是首先执行 SELECT DISTINCT label FROM tst
以获得所有列的集合,然后进行类似于我上面给出的数据透视查询。您必须从您的应用程序层以编程方式构建数据透视查询。