2016-01-20 2 views
0

У меня есть таблица, как:Относительно данные столбца

Column1 || Column2 || Column3 
------------------------ 

A || 01 || Test1 

A || 02 || Test2 

A || 03 || Test3 

B || 04 || Test4 

C || 05 || Test5 

C || 06 || Test6 

Примечание: Столбец2 является первичным ключом

И стол желаемого результата, как:

Related || Column1 || Column2 || Column3 
------------------------------- 

** || A || 01 || Test1 

** || A || 02 || Test2 

** || A || 03 || Test3 

    || B || 04 || Test4 

** || C || 05 || Test5 

** || C || 06 || Test6 

Здесь я пытаюсь показать все связанные данные столбца1 с «**», создав новый столбец. Я пыталась использовать этот запрос как:

SELECT kh.Column4, 
CASE WHEN COUNT(c.Column1) > 1 THEN '*' ELSE '' END AS Related 
FROM <TableName> WITH(NOLOCK) 
JOIN <TableName2> kh WITH(NOLOCK) ON (kh.Column4 = c.Column1) 
GROUP BY Column4 

Но не получая желаемого результата. Есть ли другой путь?

+0

Трудно помочь, когда ваш запрос не совпадать с данными выборки. Идя только по вашим образцовым данным, вам нужно GROUP BY Column1, а не Column4, как вы делаете в своем запросе. И на самом деле, переходя по данным Sample и желаемым результатам, вы должны выполнять коррелированный подзапрос, а не GROUP BY. –

ответ

0

Это должно работать:

/* Setting up the sample data */ 

    declare @kh table 
     (
    Letter nvarchar(1), 
    Number int identity(1, 1) 
       primary key 
       not null, 
    Test nvarchar(10) 
    ) 

insert into @kh 
     (Letter) 
values (N'A'), 
     (N'A'), 
     (N'A'), 
     (N'B'), 
     (N'C'), 
     (N'C') 

update @kh 
set  Test = N'Test' + cast(Number as nvarchar) 


/* The requested solution using the above sample data */ 

select case when h.ColCount > 1 then N'**' 
      else N'' 
     end as Dupes, 
     k.Letter, 
     k.Number, 
     k.Test 
from @kh as k 
left join (
      select kh.Letter, 
        count(1) as ColCount 
      from  @kh as kh 
      group by kh.Letter 
     ) as h 
on  k.Letter = h.Letter 
0

В вашем сценарии ниже код будет работать. Сначала я взял повторяющиеся значения во внутреннем блоке и оставил соединение с фактической таблицей для достижения результата.

SELECT 
    CASE WHEN REP.Column1 IS NOT NULL THEN '**' ELSE '' END AS Related, 
    TT.Column1, TT.Column2, TT.Column3 
FROM TestTable TT 
LEFT JOIN (
    SELECT Column1 
    FROM TestTable 
    GROUP BY Column1 
    HAVING COUNT(Column1) > 1 
) REP ON REP.Column1 = TT.Column1 

Рабочая Fiddle: http://sqlfiddle.com/#!3/ffa8b/5

+0

Большое спасибо Arul. Это было действительно полезно. Он работал нормально. Поскольку это первоначальное требование, я все еще работаю над этим. – Steve

+0

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

0

Вы можете использовать функцию COUNT() OVER(PARTITION BY) в вас сазе, без группы

--Test Data 
DECLARE @Test TABLE (
     Letter VARCHAR(1), 
     Number VARCHAR(10), 
     Test VARCHAR(10) 
    ) 

INSERT INTO @Test 
VALUES ('A', '01', 'Test1'), 
     ('A', '02', 'Test2'), 
     ('A', '03', 'Test3'), 
     ('B', '04', 'Test4'), 
     ('C', '05', 'Test5'), 
     ('C', '06', 'Test6') 


--Query 
SELECT CASE WHEN COUNT(*) OVER (PARTITION BY Letter) > 1 THEN '**' 
       ELSE '' 
     END [Related], 
     * 
FROM @Test 
Смежные вопросы