我正在使用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
请原谅我请求中的任何误解,相信我,他们都是无意的。
答案 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
可在此验证