SQL - оператор Case для удаления повторяющихся столбцов - PullRequest
0 голосов
/ 12 сентября 2018

У меня есть следующая таблица:

   Type_id name  Comments
   -------------------
   61        a     aa        
   62        a     Test2
   62        b     bb        
   63        c     cc   
   63        b     bb  
   63        c     bb       
   64        c     cc       

Теперь я хотел бы выбрать набор результатов следующим образом:

  Type_id name  Comments
   -------------------
   61        a     aa        
   62        a     Test2
             b     bb        
   63        c     cc   
             b     bb 
             c     bb        
   64        c     cc

Дубликат Type_id должен отображать пустую строку, если есть несколько значений. Я пытался использовать CASE заявления, но без особой удачи.

Вот запрос, который я пробовал:

      select 
        case when Type_id = 61 then  'Cell1' 
        when Type_id = 62 then  'Cell2' 
        when Type_id = 63 then  'Cell3' 
            else ''
        end as Type_id,
        name,
        Comments
     FROM 
        TBL
     where 
        CATEGORY_ID = 120
        order by Type_id

Может кто-нибудь помочь мне. Заранее спасибо.

Ответы [ 3 ]

0 голосов
/ 12 сентября 2018

вот моя версия

--temp data
if object_id('tempdb..#x') is not null drop table #x
CREATE TABLE #x(type_id INT, name VARCHAR(1), comments VARCHAR(20))
INSERT INTO #x(type_id, name, comments) VALUES
  ( 61,        'a',     'aa'),        
   ( 62,        'a',     'Test2'),
   ( 62,        'b',     'bb'),        
   ( 63,        'c',     'cc'),   
   ( 63,        'b',     'bb'),  
    (63,        'c',     'bb'),       
    (64,        'c',     'cc')

--query
SELECT CASE WHEN type_id=LAG(type_id,1,0) OVER(ORDER BY type_id) THEN NULL ELSE type_id END AS 'type_id', 
        name, comments
FROM #x

выход

type_id name    comments
61      a        aa
62      a        Test2
NULL    b        bb
63      c        cc
NULL    b        bb
NULL    c        bb
64      c        cc

Если у вас нет LAG, как заявляет запрашивающий

if object_id('tempdb..#x') is not null drop table #x
CREATE TABLE #x(type_id INT, name VARCHAR(1), comments VARCHAR(20))
INSERT INTO #x(type_id, name, comments) VALUES
  ( 61,        'a',     'aa'),        
   ( 62,        'a',     'Test2'),
   ( 62,        'b',     'bb'),        
   ( 63,        'c',     'cc'),   
   ( 63,        'b',     'bb'),  
    (63,        'c',     'bb'),       
    (64,        'c',     'cc')


if object_id('tempdb..#a') is not null drop table #a
SELECT x.*,
       ROW_NUMBER() OVER(PARTITION BY x.type_id ORDER BY x.type_id) AS 'id_count'
INTO #a
FROM #x AS x

SELECT CASE WHEN a.id_count>1 THEN NULL ELSE a.type_id END AS 'type_id',
     a.name, a.comments
FROM #a AS a
0 голосов
/ 12 сентября 2018
select 
    case when row_number() -- only return 1st value
              over (partition by Type_id
                    order by name) = 1
         then cast(Type_id as varchar(10))
         else ''
    end as Type_id,
    name,
    Comments
FROM 
    TBL
where 
    CATEGORY_ID = 120
order by Type_id, name -- same order by used in ROW_NUMBER
0 голосов
/ 12 сентября 2018

Я использовал комбинацию LAG и CASE для решения:

CREATE TABLE #temp (ID VARCHAR(2), [name] VARCHAR (1), comment VARCHAR(10))

INSERT INTO #temp (ID, [name], comment)
VALUES 

(61 , 'a' , 'aa' ),    
(62 , 'a' , 'Test2' ),
(62 , 'b' , 'bb' ),     
(63 , 'c' , 'cc' ), 
(63,  'b' , 'bb' ),
(63 , 'c' , 'bb' ),     
(64 , 'c' , 'cc' );

SELECT  CASE   WHEN id = (LAG(id, 1, 0) OVER (ORDER BY Id))
                THEN ''
                ELSE id
                END AS id,
                [name],
                comment

FROM        #temp

DROP TABLE #temp
...