【问题标题】:list of Employee having 2 products拥有 2 个产品的员工列表
【发布时间】:2021-11-05 14:36:30
【问题描述】:

有人可以帮忙吗?

我有表员工。我想找出拥有 2 个产品(P1,P2)的员工名单。

Emp_id    Prd_id
  E1         P1
  E1         P2
  E2         P1
  E2         P2
  E2         P3
  E3         P1
  E3         P3
  E4         P1
  E4         P2

所以,我想输出为

Emp_id
  E1
  E4

【问题讨论】:

  • 好的,那么您遇到了什么问题?你知道如何在 SQL 中计数吗?你知道如何计算每个员工吗?是什么阻止您编写查询?
  • 您的意思是只有 p1 和 p2 都有的 emp_id?
  • Excatly (P1,P2) 或至少? (Emp_id, Prd_id) 是唯一的吗?
  • 是的,p1 和 p2..Emp_id 和 prd_id 不是唯一的
  • 是的安德鲁.....

标签: sql teradata teradatasql


【解决方案1】:
SELECT emp_id
FROM employee
GROUP BY emp_id
HAVING COUNT(CASE WHEN prd_id 'p1' THEN 1 END) > 0 -- p1 exists
   AND COUNT(CASE WHEN prd_id 'p2' THEN 1 END) > 0 -- p2 exists
   AND COUNT(CASE WHEN prd_id NOT IN ('p1', 'p2') THEN 1 END) = 0 -- but not other

更容易扩展到更多的产品:

SELECT emp_id
FROM 
 ( -- get a unique list first
   SELECT DISTINCT emp_id, prd_id
   FROM employee
 ) AS dt
GROUP BY emp_id
HAVING SUM(CASE WHEN prd_id IN ('p1', 'p2') THEN 1 ELSE -1 END) = 2

【讨论】:

    【解决方案2】:

    如果要求查找拥有任意两种产品的员工,您可以使用having 条件来统计他们:

    SELECT   emp_id
    FROM     employees
    GROUP BY emp_id
    HAVING   COUNT(*) = 2
    

    如果这些产品必须是 p1 和 p2,您可以在其上添加另一个条件:

    SELECT   emp_id
    FROM     employees
    GROUP BY emp_id
    HAVING   COUNT(*) = 2 AND
             COUNT(CASE WHEN prd_id IN ('p1', 'p2') THEN 1 END) = 2
    

    【讨论】:

    • 谢谢 Mureinik... 我正在寻找第二个场景
    • 如果表不包含此(子集)列的重复行。更可靠的方法是对每个值进行条件聚合并检查每个值是否为> 0
    猜你喜欢
    • 2015-02-19
    • 1970-01-01
    • 2020-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多