【问题标题】:How to combine columns, group them then get a total count?如何组合列,将它们分组然后获得总数?
【发布时间】:2022-01-13 18:39:46
【问题描述】:

下面是一个表格,其中包含候选人 ID、他们以面试官姓名参加的两次面试以及每次面试的结果。

candidate_id interview_1 interview_2 result_1 result_2
1 Interviewer_A Interviewer_B Pass Pass
2 Interviewer_C Interviewer_D Pass Reject

我需要帮助将interview_1和interview_2列合并为一列,并计算每个面试官给候选人的通过和拒绝数,我期望看到的结果如下:

interviewer_name pass_count reject_count
Interviewer_A 1 0
Interviewer_B 1 0
Interviewer_C 1 0
Interviewer_D 0 1

SQL 或 Python 都适合我!非常感谢!

【问题讨论】:

  • 它是熊猫数据框吗?

标签: python sql sql-server


【解决方案1】:

在 SQL Server 中,CROSS APPLY 就成了小事

示例

Select [candidate_id]
      ,B.[Interview_name]
      ,pass_count   = case when result='Pass' then 1 else 0 end
      ,reject_count = case when result='Pass' then 0 else 1 end
 From YourTable A
 Cross Apply ( values ([interview_1],[result_1])
                     ,([interview_2],[result_2])
             ) B(Interview_name,result)

结果

candidate_id    Interview_name  pass_count  reject_count
1               Interviewer_A   1           0
1               Interviewer_B   1           0
2               Interviewer_C   1           0
2               Interviewer_D   0           1

【讨论】:

  • 获得我的投票,但如果表值构造函数只返回原始结果并且您的案例表达式在外部选择中而不是为表值构造函数的每一行重复,那么可以说会更简单一些.当然完全是主观的,无论哪种方式都或多或少正确
  • @GarethD 你是对的,在我真正看到冗余的 case 表达式之后,我确实考虑了一个简单的逻辑开关来通过/拒绝。我们称之为懒惰的复制粘贴..我将添加更薄的版本
  • 非常感谢!我也使用 SQL Server,但我不熟悉 CROSS APPLY。非常感谢!
  • @PeachKiller 乐于助人。交叉申请可能是无价的。值得花一点时间来试验它。我认为它是记录级别的子程序。还有一个好处是您可以堆叠可重用的计算。
【解决方案2】:

您可以将数据集拉两次并合并在一起,我假设它不是一个笨拙的集合。

类似的东西-

WITH combined_set AS(
SELECT
 candidate_id,
 interviewer_1 as interviewer,
 result_1 as result
from candidate_table

UNION

SELECT
 candidate_id,
 interviewer_2 as interviewer,
 result_2 as result
from candidate_table)

SELECT
 interviewer,
 count(case when result = 'Pass' then 1 end) as pass_count,
 count(case when result = 'Reject' then 1 end) as reject_count
FROM combined_set

【讨论】:

  • 感谢您的帮助!我最初尝试过这种方式,但是面试有20列,结果有20列.....
  • 对 python 不太熟悉,但如果你的数据大小发生变化,我想你可以编写一些代码来获取最大采访计数,然后运行一个 for 循环来堆叠从抓取开始的列第一个采访列的索引和该索引 + 最大值,然后从那里聚合它,或者将循环标记为抓取 [interview_i] 和 [results_i] 并在 i > max 上结束
猜你喜欢
  • 2020-12-05
  • 1970-01-01
  • 2021-07-06
  • 1970-01-01
  • 2021-11-22
  • 2021-04-13
  • 1970-01-01
  • 2022-11-14
  • 1970-01-01
相关资源
最近更新 更多