多行数据转换为单行

时间:2015-10-01 22:46:46

标签: sql sqlite

我正在使用SQLite而且我真的很绿。基本上我有一张桌子(下面的例子)

ID  Date    QuestNum    Value
1   1/1/1990    1   0
1   1/1/1990    2   3
1   1/1/1990    3   2
1   1/2/1990    1   5
1   1/2/1990    2   2
1   1/2/1990    3   6
2   1/1/1990    1   6
2   1/1/1990    2   3
2   1/1/1990    3   6
2   1/2/1990    1   2
2   1/2/1990    2   8
2   1/2/1990    3   2

我的查询结果看起来像这样

ID  Date    Quest1  Quest2  Quest3
1   1/1/1990    0   3   2
1   1/2/1990    5   2   6
2   1/1/1990    6   3   6
2   1/2/1990    2   8   2

我最接近的是

SELECT 
    ID, Date,
    MAX(CASE WHEN QuestNum = "1" THEN Value END) AS Q1,
    MAX(CASE WHEN QuestNum = "2" THEN Value END) AS Q2,
    MAX(CASE WHEN QuestNum = "3" THEN Value END) AS Q3,
FROM table
GROUP BY subjID, Date

虽然这确实提供了我正在寻找的结构,但它应用MAX聚合函数,我担心结果查询包含的数据与原始集不同;这样,Quest 1,Quest 2,Quest 3列中返回的值是该选定列的最大值,而不是值列中的相应数据点。

我不确定是否重要的​​是要注意,但QuestNum有时会跳过,所以不是每个人都会收到所有问题。

谢谢, QWERTY

请原谅我请求中的任何误解,相信我,他们都是无意的。

3 个答案:

答案 0 :(得分:1)

使用GROUP BY ID, Date作为群组表达。

SELECT除了某些数据库中的某些函数(例如修改序列的nextval)之外,从不改变您的数据,但这些更改是明确记录的。像这样的简单聚合函数是完全安全的。

但你所看到的不是一张桌子,它只是一个结果。如果需要包含结果的新表,则需要一个类似

的语句
SELECT ID,Date,
MAX(CASE WHEN QuestNum = "1" THEN Value END) AS Quest1,
MAX(CASE WHEN QuestNum = "2" THEN Value END) AS Quest2,
MAX(CASE WHEN QuestNum = "3" THEN Value END) AS Quest3,
FROM table
INTO table2
GROUP BY GROUP BY ID, Date

(注意INTO table2

答案 1 :(得分:1)

基本上,您需要将行转置到列或重塑从长格式到宽格式。在SQL中,这可以使用派生表(子查询的类型)来完成:

SELECT 
      [ID],
      [Date],
      Max(CASE WHEN QuestNum = "1" THEN [Value] END) As Q1,
      Max(CASE WHEN QuestNum = "2" THEN [Value] END) As Q2, 
      Max(CASE WHEN QuestNum = "3" THEN [Value] END) As Q3
FROM (SELECT 
            [ID], 
            [Date], 
            QuestNum,
            [Value]
      FROM TableName) 
AS dT
GROUP BY [ID], [Date]

答案 2 :(得分:0)

查询非常简单(或者您在说明中遗漏了一些内容):

select 
 id ,  
max(CASE WHEN QuestNum = 1 THEN Value else 0 END ) as Q1 ,
 max(CASE WHEN QuestNum = 2 THEN Value else 0 END ) As Q2, 
 max(CASE WHEN QuestNum = 3 THEN Value else 0 END ) As Q3,
 [date]
from tab
group by id, [date]

结果很像你想要的:

ID  Q1  Q2  Q3  Date
1   0   3   2   1/1/1990
1   5   2   6   1/2/1990
2   6   3   6   1/1/1990
2   2   8   2   1/2/1990

可在此验证

SQLFiddle example