数据透视表,以便用户及其日期转到一行

时间:2016-02-24 20:58:04

标签: sql postgresql

我想从这样的事情出发:

username    CourseID    DateTaken
mikeb       LST          5/9/2014
mikeb       SELAGENT001  4/4/2013
chrisp      AGT001       2/21/2012
chrisp      SELAGENT001  6/27/2011

这样的事情:

Username    LST         SELAGENT001 AGT001
mikeb       5/9/2014    4/4/2013    
chrisp                  6/27/2011   2/21/2012

我试着错过了交叉表,但是因为我正在处理日期,所以我很难过。有什么帮助吗?

1 个答案:

答案 0 :(得分:0)

这是ANSI SQL的解决方案,假设每个username, courseid对只有一行,它将返回预期的结果。否则,它会为每对获取最大datetaken值。

SELECT
  username,
  MAX(CASE WHEN courseid = 'LST' THEN datetaken END) AS lst,
  MAX(CASE WHEN courseid = 'SELAGENT001' THEN datetaken END) AS selagent001,
  MAX(CASE WHEN courseid = 'AGT001' THEN datetaken END) AS agt001
FROM t
GROUP BY username

如果你想要Postgres特定的答案,tablefunc模块中有一个crosstab()函数,但我个人总是喜欢便携式解决方案而非DBMS特定。

作为参考,您还可以查看this answer