Oracle 12c-选择组中具有多个值的行

时间:2018-09-28 18:49:02

标签: sql oracle oracle12c

select ssn, count(*) 
from (
  select ssn, employee_id, is_active 
  from employee 
  where is_active ='Y'
)
group by ssn
having count(*) > 1

我想修改此查询以查找表中存在的所有ssn,但不止一次,但具有不同的employee_id,至少一个记录的is_active为是的。

4 个答案:

答案 0 :(得分:1)

如果您需要所有详细信息,则:

SELECT ssn,
       employee_id,
       is_active 
FROM   (
  SELECT ssn,
         employee_id,
         is_active,
         COUNT( DISTINCT employee_id ) OVER ( PARTITION BY ssn ) AS num_emps,
         COUNT( CASE is_active WHEN 'Y' THEN 1 END ) OVER ( PARTITION BY ssn )
           AS num_active
  FROM   employee
)
WHERE  num_emps > 1
AND    num_active > 0

如果您只想要ssn,则:

SELECT ssn
FROM   employee
GROUP BY ssn
HAVING COUNT( DISTINCT employee_id ) > 1
AND    COUNT( CASE is_active WHEN 'Y' THEN 1 END ) > 0;

答案 1 :(得分:1)

不需要子查询或CTE,只需group byhaving

select ssn, count(*) 
from employee
group by ssn
having min(employee_id) <> max(employee_id) and
       sum(case when is_active ='Y' then 1 else 0 end) >= 1;

答案 2 :(得分:0)

您可以使用窗口COUNT来获取不同的雇员数量,并使用SUM来至少在活动状态下进行处理:

WITH cte AS(
  select ssn, employee_id,
   COUNT(DISTINCT employee_id) OVER(PARTITION BY ssn) AS cnt,
   SUM(CASE WHEN is_active ='Y' THEN 1 ELSE 0 END) OVER(PARTITION BY ssn) AS s_active
  from employee 
)
SELECT *
FROM cte
WHERE cnt > 1 AND s_active > 1;

答案 3 :(得分:0)

如果我理解正确,应该这样做

select TMP.*
from (
  select CASE WHEN MIN(employee_id) OVER( PARTITION BY ssn) <>
                   MAX(employee_id) OVER( PARTITION BY ssn) THEN 'Y'
              ELSE 'N'
          END AS hasMultipleDistinctEmployees,
         CASE WHEN MAX(CASE WHEN is_active = 'Y' THEN 1 ELSE 0 END) OVER
                     ( PARTITION BY ssn ) = 1 THEN 'Y' 
              ELSE 'N'
          END AS hasAtLeaseOneActive,
  ssn, employee_id, is_active 
  from employee 
) TMP
WHERE hasMultipleDistinctEmployees = 'Y'
  AND hasAtLeaseOneActive = 'Y'