Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL如何选择两列中具有相同值的不同行_Sql_Sql Server_Ssms - Fatal编程技术网

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