基于其他问题答案的权重求和SQL查询需求
嘿,我来帮你搞定这个权重求和的查询需求,结合你给出的示例,我整理了清晰的思路和SQL实现方案~
需求梳理与查询实现
核心需求拆解
- 针对每个问题(如
q17、q18直至q24),计算其对应权重列的总和 - 关键规则:仅保留那些在所有其他问题中都有有效答案的行的权重值,如果某行在任意一个其他问题中没有对应值,就把该行的权重排除在求和范围外
示例验证
你给出的示例刚好能体现这个规则:
q17权重列表:5 5 4 3 5 5 4 5→ 求和36(8个值都符合条件)q18权重列表:4 2 3 2 5 4 1 4→ 求和36(同上)q21权重列表:4 5 3 5 5 1→ 求和26(仅6个值符合条件,另外2个值对应的行在其他问题中无答案,被排除)
通用SQL实现方案(以MySQL为例)
假设你的表结构是:每一行对应一个受访者的所有回答,包含respondent_id(受访者唯一标识),以及q17_weight、q18_weight等各问题的权重列。
步骤1:筛选符合条件的受访者
首先得找出那些在所有问题中都有有效答案的受访者,这样后续只计算这些受访者的权重:
SELECT respondent_id FROM your_table_name WHERE q17_weight IS NOT NULL AND q18_weight IS NOT NULL AND q19_weight IS NOT NULL AND q20_weight IS NOT NULL AND q21_weight IS NOT NULL AND q22_weight IS NOT NULL AND q23_weight IS NOT NULL AND q24_weight IS NOT NULL;
步骤2:计算每个问题的权重总和
把上面的筛选结果作为条件,对每个权重列求和:
SELECT SUM(q17_weight) AS q17_total_weight, SUM(q18_weight) AS q18_total_weight, SUM(q19_weight) AS q19_total_weight, SUM(q20_weight) AS q20_total_weight, SUM(q21_weight) AS q21_total_weight, SUM(q22_weight) AS q22_total_weight, SUM(q23_weight) AS q23_total_weight, SUM(q24_weight) AS q24_total_weight FROM your_table_name WHERE respondent_id IN ( -- 这里嵌入步骤1的子查询 SELECT respondent_id FROM your_table_name WHERE q17_weight IS NOT NULL AND q18_weight IS NOT NULL AND q19_weight IS NOT NULL AND q20_weight IS NOT NULL AND q21_weight IS NOT NULL AND q22_weight IS NOT NULL AND q23_weight IS NOT NULL AND q24_weight IS NOT NULL );
灵活调整:如果“无对应值”是0而非NULL
如果你的数据中,“无对应值”是用0表示而不是NULL,只需要把上面的IS NOT NULL改成!= 0即可。
另一种写法:用HAVING子句筛选
如果你的数据库支持,也可以用GROUP BY+HAVING的方式筛选受访者,写法更灵活(比如后续新增问题时,只需要加一条COUNT判断):
SELECT SUM(q17_weight) AS q17_total_weight, SUM(q18_weight) AS q18_total_weight, SUM(q19_weight) AS q19_total_weight, SUM(q20_weight) AS q20_total_weight, SUM(q21_weight) AS q21_total_weight, SUM(q22_weight) AS q22_total_weight, SUM(q23_weight) AS q23_total_weight, SUM(q24_weight) AS q24_total_weight FROM your_table_name WHERE respondent_id IN ( SELECT respondent_id FROM your_table_name GROUP BY respondent_id HAVING COUNT(CASE WHEN q17_weight IS NULL THEN 1 END) = 0 AND COUNT(CASE WHEN q18_weight IS NULL THEN 1 END) = 0 AND COUNT(CASE WHEN q19_weight IS NULL THEN 1 END) = 0 AND COUNT(CASE WHEN q20_weight IS NULL THEN 1 END) = 0 AND COUNT(CASE WHEN q21_weight IS NULL THEN 1 END) = 0 AND COUNT(CASE WHEN q22_weight IS NULL THEN 1 END) = 0 AND COUNT(CASE WHEN q23_weight IS NULL THEN 1 END) = 0 AND COUNT(CASE WHEN q24_weight IS NULL THEN 1 END) = 0 );
特殊情况处理
如果你的表结构是每个问题占一行(比如行是q17、q18,列是各个受访者的权重),那需要先把行转列(用UNION ALL或者数据库自带的转置函数,比如SQL Server的UNPIVOT),再按照上面的逻辑计算总和。
内容的提问来源于stack exchange,提问作者Pop Levente
相关产品推荐
相关产品推荐

