T-SQL - возвращать записи с одинаковыми значениями в двух столбцах, но с разными значениями в третьем столбце - PullRequest
0 голосов
/ 04 декабря 2018

Учитывая этот пример данных:

ID    lname        fname    num
1     Jones        Mary     672
2     Jones        Mary     123
3     Johnson      Ellen    853
4     Jones        Mary     123
5     Jones        Scott    342
6     Smith        John     874
7     Anders       David    433
8     Northson     Sue      756
9     Fredricks    George   555
10    Northson     Sue      756
11    Northson     Sue      756
12    Perry        Nicole   335
11    Northson     Sue      342

Я хочу найти все пары lname / fname, которые имеют несколько «num» и количество строк с этим значением «num».

Таким образом, набор результатов должен выглядеть следующим образом:

lname        fname    num    count
Jones        Mary     672    1
Jones        Mary     123    2
Northson     Sue      756    3
Northson     Sue      342    1

Единственное, что я мог придумать, это ниже, но выборка в предложении where возвращает больше, чем строка

select
    lname
    ,fname
    ,num
    ,COUNT(*)
from sampleTable
where
    (num != (select x.num
             from sampleTable x
             where x.ID != sampleTable.ID
                 and x.fname = sampleTable.fname
                 and x.lname = sampleTable.lname)   
     )
group by lname, fname, num
--having count(num) > 1
order by lname, fname, num

Ответы [ 2 ]

0 голосов
/ 04 декабря 2018
select  lname, fname, num, 
    row_number() over(PARTITION BY lname, fname, num ORDER BY lname, fname, num) as cnt,
    row_number() over(PARTITION BY lname, fname ORDER BY lname, fname) as pairs
from  sampleTable  

возвращает (из моей временной версии вашей таблицы)

lname   fname   num cnt pairs
Jones   Mary    123 1   1
Jones   Mary    672 1   2
Jones   Scott   111 1   1
Jones   Scott   111 2   2
Jones   Scott   342 1   3
Jones   Scott   874 1   4
0 голосов
/ 04 декабря 2018

Другой подход состоит в том, чтобы присоединиться к другому запросу и подсчитать количество различных num s за lname / fname комбинацию:

SELECT   a.lname, a.fname, a.num, a.cnt
FROM     (SELECT   lname, fname, num, COUNT(*) AS cnt
          FROM     sampleatable
          GROUP BY lname, fname, num) a
JOIN     (SELECT   lname, fname
          FROM     sampletable
          GROUP BY lname, fname
          HAVING   COUNT(DISTINCT num) > 1) b ON a.lname = b.lname AND a.fname = b.fname
...