2013-11-27 2 views
0
row | P_NO | B_NAME 
    1 | 123 | ABC ELEC 
    2 | 123 | ABC ELEC 
    3 | 123 | ABC ELEC 
    4 | 123 | ABC TRANSPORT 
    5 | 123 | ABC CONTRACTORS 
    6 | 124 | ABC STATIONARY 
    7 | 125 | ABC ELEC 
    8 | 126 | ABC ELEC 

Я очень новичок в SQL. Как выбрать только P_NO и B_NAME, где один P_NO появляется более чем для одного B_NAME.SQL - Group By Distinct

Выход должен быть только один из первых трех строк и строк 4 и 5

SQL SERVER 2012

+0

Что вы ожидаемый результат? Я имею в виду, как вы хотите определить, какое B_Name будет выбрано? –

+0

Выход должен быть одним из первых трех строк и строк 4 и 5 – user2955297

ответ

1

[обновлено]

, что вы ищете:

select p_no 
    , b_name 
    from Uhura.dbo.test 
where p_no in (select p_no 
        from Uhura.dbo.test 
       group by 
         p_no 
       having count(distinct b_name) > 1) 
group by 
     p_no 
    , b_name 

он подсчитывает количество различных b_name для каждого p_no и использует те, которые имеют более одного, чем фильтр для внешнего выбора. он затем устраняет дубликаты по группам:

enter image description here

+0

Не работает, проверьте мой отредактированный вопрос. – user2955297

+0

Я обновил свой ответ на ваш обновленный вопрос –

+0

, что вы спасли мне целый день. shot man – user2955297

3

попробовать это ...

SELECT 
    P_NO, 
    B_NAME 
FROM 
    table_name1 
WHERE P_NO IN 
    (SELECT 
    P_NO 
    FROM 
    table_name1 
    GROUP BY P_NO 
    HAVING COUNT(P_NO) > 1) 
+0

Не работает, проверьте мой отредактированный вопрос. – user2955297

0

Попробуйте сделать это:

SELECT DISTINCT a.P_NO,a.B_NAME 
FROM tab1 a 
INNER JOIN 
    (SELECT P_NO,B_NAME 
    FROM tab1 
    GROUP BY P_NO,B_NAME 
    HAVING COUNT(*) > 1 
) b ON a.P_NO = b.P_NO 

sqlfiddle demo

Это JOINS исходную таблицу с SELECT, который дает вам только P_NO о том, что происходят не один раз.

+0

Не работает, проверьте мой отредактированный вопрос. – user2955297

+0

@ пользователь2955297. Я отредактировал свой ответ. посмотри, что это то, что ты хотел. –

0

Попробуйте

;with TempData as (Select row ,P_NO,DataCount =ROW_NUMBER() 
        over(PARTITION By P_NO Order By B_NAME) 
        from YourTable) 


Select * 
from YourTable 
where P_NO In (Select distinct P_NO from TempData where DataCount>1) 

или

Select distinct T.* 
From YourTable T 
    Inner Join TempData TD on T.P_NO=TD.P_NO 
Where TD.DataCount>1 
+0

Не работает, проверьте мой отредактированный вопрос. – user2955297

+0

@ user2955297: Обновлен ответ !! попробуйте сейчас –

Смежные вопросы