SQL如何选择两列中具有相同值的不同行
我有这个输入表SQL如何选择两列中具有相同值的不同行,sql,sql-server,ssms,Sql,Sql Server,Ssms,我有这个输入表 +--------+---------+---------+-------+-----------+ | TaskId | member1 | member2 | score | functions | +--------+---------+---------+-------+-----------+ | 1 | Jack | Jack | 100 | marketing | | 1 | Jack | Jack | 100 |
+--------+---------+---------+-------+-----------+
| TaskId | member1 | member2 | score | functions |
+--------+---------+---------+-------+-----------+
| 1 | Jack | Jack | 100 | marketing |
| 1 | Jack | Jack | 100 | marketing |
| 2 | Jack | Steve | 90 | interior |
| 2 | Jack | Steve | 90 | interior |
| 3 | Steve | Jack | 70 | program |
| 3 | Steve | Jack | 70 | program |
| 4 | Jack | Mia | 30 | develop |
| 4 | Jack | Mia | 30 | develop |
| 5 | Mia | Jack | 20 | interior |
| 5 | Mia | Jack | 20 | interior |
+--------+---------+---------+-------+-----------+
我计算了两件事
UniqueHighTasks:不同于Jack的任务,例如:Jack在分数75-100中存在,无论他是成员1还是成员2
UniqueLowTasks:不同于Jack的任务,例如:Jack在0-100分之间存在,无论他是成员1还是成员2
我排除了member1=member2的计算
现在,我想计算Jack在member1或member2中存在的不同数量的函数
例如:成员1中的Jack位于内部,开发
成员2中的插孔在程序中,内部
我的最终结果的计数是4,这是错误的,我怎样才能得到不同的计数,对于Jack是3,这是内部的,开发的,编程的,其余的名字都一样
您可以使用UNION ALL将两个集合组合在一起,并在单个位置应用您的逻辑,而不是对单个集合应用您的逻辑
SELECT member,
uniquehightasks,
uniquelowtasks,
[%High] = uniquehightasks * 100.0 / ( uniquehightasks + uniquelowtasks ),
[%Low] = uniquelowtasks * 100.0 / ( uniquehightasks + uniquelowtasks ),
functions
FROM (SELECT member,
Sum(uniquehightasks) AS 'UniqueHighTasks',
Sum(uniquelowtasks) AS 'UniqueLowTasks',
Sum(functions) AS 'functions'
FROM (SELECT member,
UniqueHighTasks = Count(DISTINCT CASE WHEN score >= 75 THEN [taskid] END),
UniqueLowTasks = Count(DISTINCT CASE WHEN score < 75 THEN [taskid] END),
functions=Count(DISTINCT functions)
FROM (SELECT [taskid], member1 AS Member, functions, score
FROM mytable
WHERE member1 != member2
UNION ALL
SELECT [taskid], member2 AS member,functions, score
FROM mytable
WHERE member1 != member2) t22
GROUP BY member)t3
GROUP BY t3.member) t4
你为杰克得到计数为4的原因是因为你的工会双方都给你一个计数2,然后你做一个总和 试试这个,但是这也会为Mia提供计数2,而不是1
这是另一种方法。我对Mia的结果和你的不同
select
member, UniqueHighTasks, UniqueLowTasks
, High = UniqueHighTasks * 100.0 / (UniqueHighTasks + UniqueLowTasks)
, Low = UniqueLowTasks * 100.0 / (UniqueHighTasks + UniqueLowTasks)
, functions
from (
select
member = case when n = 1 then member1 else member2 end
, UniqueHighTasks = count(distinct case when score >= 75 then taskid end)
, UniqueLowTasks = count(distinct case when score < 75 then taskid end)
, functions = count(distinct functions)
from
mytable
cross apply (values (1), (2)) q(n)
where
member1 <> member2
group by case when n = 1 then member1 else member2 end
) t
我认为这应该解决你的问题:
;with cte as (
select member1,member2,functions from mytable
where member1 <> member2
)
select member1, count(distinct functions) from (
select member1, functions from cte
union all
select member2, functions from cte
) [a] group by member1
为什么这个问题被否决了?我想OP也可以问同样的问题,但是可以用更易读的方式,或者只是用更简单的数据。在计算函数时,UniqueTasks的意义是什么?如果不是,那么Mia的函数也应该是2而不是1?
select
member, UniqueHighTasks, UniqueLowTasks
, High = UniqueHighTasks * 100.0 / (UniqueHighTasks + UniqueLowTasks)
, Low = UniqueLowTasks * 100.0 / (UniqueHighTasks + UniqueLowTasks)
, functions
from (
select
member = case when n = 1 then member1 else member2 end
, UniqueHighTasks = count(distinct case when score >= 75 then taskid end)
, UniqueLowTasks = count(distinct case when score < 75 then taskid end)
, functions = count(distinct functions)
from
mytable
cross apply (values (1), (2)) q(n)
where
member1 <> member2
group by case when n = 1 then member1 else member2 end
) t
member UniqueHighTasks UniqueLowTasks High Low functions
-----------------------------------------------------------------------------------------
Jack 1 3 25.000000000000 75.000000000000 3
Mia 0 2 0.000000000000 100.000000000000 2
Steve 1 1 50.000000000000 50.000000000000 2
;with cte as (
select member1,member2,functions from mytable
where member1 <> member2
)
select member1, count(distinct functions) from (
select member1, functions from cte
union all
select member2, functions from cte
) [a] group by member1