我对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?
我非常感谢你的帮助。感谢
答案 0 :(得分:1)
如果您愿意接受您的答案列表作为逗号分隔列表而不是实际列,您可以使用PostgreSQL的string_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