如何用SQL对单表中存储的多字段调查答案进行排序?
行存储答案表的多字段排序实现
当然可以实现,核心思路是先把同一个作答人的不同字段答案整合到同一行,再按要求排序。以下是两种常用方案:
方案一:条件聚合(适合多字段场景)
通过CASE语句将分散在不同行的字段值聚合到同一行,再进行排序:
SELECT Person, -- 提取Field=1的数值答案 MAX(CASE WHEN Field = 1 THEN Value END) AS field1_num, -- 提取Field=2的布尔答案 MAX(CASE WHEN Field = 2 THEN Value END) AS field2_bool FROM Answers GROUP BY Person ORDER BY -- 转成整数类型,避免文本排序的错误(比如'5'和'10'文本排序会出现逻辑偏差) CAST(field1_num AS INT) ASC, -- 将yes/no转成数字,控制排序优先级(示例中让yes排在no前面) CASE field2_bool WHEN 'yes' THEN 1 WHEN 'no' THEN 0 END DESC;
方案二:自连接(适合固定两个字段的场景)
直接通过作答人ID关联两个字段的记录,再排序:
SELECT a1.Person, a1.Value AS field1_num, a2.Value AS field2_bool FROM Answers a1 -- 关联同一个用户的Field=2记录 JOIN Answers a2 ON a1.Person = a2.Person AND a1.Field = 1 AND a2.Field = 2 ORDER BY CAST(a1.Value AS INT) ASC, CASE a2.Value WHEN 'yes' THEN 1 WHEN 'no' THEN 0 END DESC;
关键注意点
- 因为
Value列是文本类型,排序Field1的数值时必须用CAST转成整数,否则会按文本字典序排序,导致数值逻辑排序错误。 - 布尔类型的
yes/no排序需要用CASE转成数字,确保排序逻辑符合业务预期(比如调整1和0的顺序可以切换yes/no的优先级)。
内容的提问来源于stack exchange,提问作者dertiende
相关产品推荐
相关产品推荐

