合并SQL SELECT查询中的行

时间:2013-10-11 10:40:02

标签: sql sqlite

我想从SQL查询中合并一些结果。要应用限制,必须删除某些行,同时将一些值添加到另一行。应合并的行数是变化的。 这很难解释,所以这里有一个例子来说明我的意思:

Same values | 1 | Date | City
Same values | 2 | Date | City
Same values | 3 | Date | City

这应该转换成这样的东西:

Same values | Date1 | City1 | Date2 | …

所以,我基本上想要尽可能简单地访问所有数据。你有一个简单的解决方案吗?

1 个答案:

答案 0 :(得分:0)

假设你的表是这样的(我添加了列名):

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;

<强> Example On 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");
相关问题