SQL: чтобы получить один из дубликатов с помощью оператора case

У меня есть таблица, в которой есть два столбца с дубликатами.

id name  classname description 
-----------------------------
1  a     aa        aa:abcd  
2  a     Unknown   Unknown 
3  b     bb        unknown 
4  c     cc        abcd 

Теперь у меня есть запрос выбора, в котором я должен отфильтровать все дубликаты, и мое описание отображается как идентификатор, мой результат должен быть таким,

id name identifier
-----------------
1  a   aa
2  b   NULL 
3  c   NULL

где все описания без ':' в качестве символьного индекса должны отображаться как NULL или Unknown как Null.

Я использую приведенный ниже запрос выбора для фильтрации дубликатов в столбце «имя», но я не могу использовать тот же запрос для описания, что и случай для получения результата, чтобы обрезать мое описание «aa: abcd». ' к аа

    select distinct 
           id,
           (select top 1 name 
             from table1 t 
            where t.name = t1.name 
            order by case t1.classname 
                        when 'Unknown Tag Class' then 0 
                        else 1 
                     end
            ) name,
            (case when charindex(':',Description)> 0
               then substring(Description,1,(charindex(':',Description)-1)) 
            end
            ) as Identifier
    from table1  t1

In the above query I want to modify the case statement of description so that i can filter duplicates and also trim the values like "aa:abcd" to "aa" and put them in identifier column.

Need help on this.


this is the query i am using 

IF  EXISTS (SELECT * FROM sys.objects     WHERE object_id = OBJECT_ID(N'[dbo].[EXEC_REP_TransposedTagAttributes]')
AND type in (N'U'))
BEGIN
   select distinct 
      [Att : 42674] as TagID
       ,Tagname
       ,isnull([Att : 14591],'-') as OriginatingContractor
       ,isnull([Att : 14594],'-') as System
      ,(case when charindex(':',TargetName)> 0 then 
    substring(TargetName,(charindex(':',TargetName)+1),len(TargetName)) 
   end) as SystemDescription
,(case when charindex(':',TagClassDescription)> 0 then 
    substring(TagClassDescription,1,(charindex(':',TagClassDescription)-1)) 
   end) as TagIdentifier
from EXEC_REP_TransposedTagAttributes t1
LEFT JOIN (SELECT SourceName, TargetName FROM EXEC_REP_Associations WHERE AssociationType = '3' and TargetClassName = 'SUB SYSTEM') b ON TagName = b.SourceName
where tagname='ZIH-210053' Order by [Att : 42674]
END
ELSE
 select 'Reporting Database is being refreshed, please wait.' as errMsg

и результат, который я получаю,

TagID Имя тега OriginatingContractor System SystemDescription TagIdentifier

2609005 ZIH-210053 Hyundai Heavy Industries (верхние части) 210 Slugcatcher NULL 2609005 ZIH-210053 Hyundai Heavy Industries (верхние части) 210 Slugcatcher ZIH

есть также строки, которые имеют идентификатор тега как нулевой и не имеют дубликатов


person user2861354    schedule 18.10.2013    source источник
comment
SQL-сервер? Или другая система баз данных? Пожалуйста, добавьте соответствующий тег. Кроме того, вы просто рассматриваете дубликаты в name или возможный identifier также участвует в определении; т. е. возможно ли, что есть строка с name = a и description = df:ghi, и если да, то является ли результат одной строкой с name a (как мы определяем идентификатор?) или есть две строки?   -  person Damien_The_Unbeliever    schedule 18.10.2013
comment
Не ясно, какую строку дубликатов нужно выбрать.   -  person valex    schedule 18.10.2013
comment
это находится в базе данных SQL, я хочу, чтобы мой результат имел один из дубликатов и соответствующий псевдоним идентификатора с одним из дубликатов, если дубликаты существуют, он не должен иметь имя = a и идентификатор = a: fjsa вместо этого он должен иметь имя = q и идентификатор = a (если описание a:fjsa) name=q и идентификатор = null (если описание afdafd или Unknown, т.е. без : ), а также должен отфильтровать все дубликаты   -  person user2861354    schedule 18.10.2013
comment
-Valex, я хочу выбрать имя и обрезать описание, удалив часть после :, и отобразить описание как идентификатор без дубликатов.   -  person user2861354    schedule 18.10.2013
comment
это вопрос, который я забавляюсь, где   -  person user2861354    schedule 18.10.2013


Ответы (1)


select id,name,
       CASE WHEN charindex(':',description)>0
         THEN LEFT(description,charindex(':',description)-1) 
         ELSE NULL
       END as identifier

from t as t1
where description like '%:%'
      or NOT EXISTS (select * from t where t.id<>t1.id and t.name=t1.name);

демонстрация SQLFiddle

person valex    schedule 18.10.2013