假设您的表是这样的(我添加了列名):
A | B | C | D
------------+---+----------+------
Same values | 1 | 20130101 | City1
Same values | 2 | 20130102 | City2
Same values | 3 | 20130103 | City3
您的查询将是:
SELECT A,
MAX(CASE WHEN B = 1 THEN C END) C1,
MAX(CASE WHEN B = 1 THEN D END) D1,
MAX(CASE WHEN B = 2 THEN C END) C1,
MAX(CASE WHEN B = 2 THEN D END) D1,
MAX(CASE WHEN B = 3 THEN C END) C1,
MAX(CASE WHEN B = 3 THEN D END) D1
FROM T
GROUP BY A;
SQL Fiddle 示例
这使:
A | C1 | D1 | C1 | D1 | C1 | D1
-------------+-----------+--------+----------+--------+----------+--------
Same values | 20130101 | City1 | 20130102 | City2 | 20130103 | City3
据我所知,SQLite 不支持动态 SQL,因此如果您不知道在运行时需要多少列,则需要在应用程序层中构建查询,然后将其发送到数据库。
所以你需要得到 B 的最大值:
SELECT MAX(B) B FROM T;
然后循环 1 到 B 的最大值(我不知道您使用的是什么语言,但在 C# 中,因为它是我今天使用的):
var sb = new StringBuilder();
var template = ", MAX(CASE WHEN B = {0} THEN C END) C{0}, MAX(CASE WHEN B = {0} THEN D END) D{0}";
sb.Append("SELECT A");
for (int i = 1; i < MaxB; i++) {
sb.Append(string.Format(template, i);
}
sb.Append(" FROM T GROUP BY A");