2

我对 SQL 完全陌生,所以我想我的问题很简单,但到目前为止我无法自己执行所需的输出。

我做了一个调查,让 3 个人解决任务 A(有 3 个任务)和 3 人解决任务 B(有 3 个任务)。

然后我做了一个看起来像这样的表:

Table: Results
+---------+---------+---------+---------+---------+
| ID      | AssgnID | Answer1 | Answer2 | Answer3 |
+---------+---------+---------+---------+---------+
| 1       | A1      | 20      | 45      | 80      |   
| 2       | A1      | 22      | 40      | 82      |  
| 3       | A1      | 25      | 39      | 85      |
| 4       | A2      | 45      | 10      | 75      |
| 5       | A2      | 50      | 15      | 72      |
| 6       | A2      | 50      | 12      | 80      |
+---------+---------+---------+---------+---------+

我现在要做的是,为 AssgnID A1 和 A2 显示一行中的所有答案,如下所示:

Table: Results per AssgnID
+---------+---------+---------+---------+---------+--------+---------+---------+--------+---------+---------+
| ID      | AssgnID | Answer1 | Answer2 | Answer3 |Answer4 | Answer5 | Answer6 |Answer7 | Answer8 | Answer9 |
+---------+---------+---------+---------+---------+---------+---------+---------+-------+---------+---------+
| 1       | A1      | 20      | 45      | 80      | 22     | 40      | 82      | 22     | 40      | 82          
| 2       | A2      | 45      | 10      | 75      | 50     | 15      | 72      | 50     | 12      | 80                  
+---------+---------+---------+---------+---------+---------+---------+---------+-------+---------+---------+

我可以通过使用 DISTINCT 或 GROUP BY 显示不同的 AssgnID,但我无法在同一输出中显示所有结果。

我必须尝试使用​​ JOIN 吗?

我非常感谢你的帮助。谢谢

4

1 回答 1

1

如果您愿意接受您的答案列表作为逗号分隔列表而不是实际列,您可以使用 PostgreSQLstring_agg()通过将每行的三个答案列连接成一个单元来强制它们进入列表,然后将所有这些组合在一起:

SELECT 
  AssgnID,
  /* Concat the 3 answers together with `,`, the group all rows together separated by `,` */
  string_agg((Answer1 || ',' || Answer2 || ',' || Answer3), ',') AS Answers
FROM yourtable
GROUP BY AssgnID

会产生:

A1   20,45,80,22,40,82,22,42,82
A2   45,10,75,50,15,72,50,12,80

但是,如果您需要执行额外的 SQL 操作,最好的做法和最好的永久解决方案是重新设计您的表结构,以便以规范化的方式存储这些答案。此方法在一个表中定义调查,另一个表每个答案保存一行,或每个答案保存三行SurveyID

表调查

SurveyID
AssgnID
UserID

表答案

SurveyID
Answer
Value
于 2012-08-20T16:29:33.897 回答