Внедрение CTE - PullRequest
       3

Внедрение CTE

3 голосов
/ 16 июля 2011

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

create table #prd
(
  ver varchar(20),
  fam varchar(20),
  mm varchar(20),
)

insert into #prd values('dt','fam1','111')
insert into #prd values('dt','fam1','222')
insert into #prd values('mb','fam1','333')
insert into #prd values('mb','fam2','444')

Мне нужен вывод, как показано ниже, используя CTE:

ver       family       MM
-------   ---------    ----------    
DT          fam1         111,222  
mb          fam1         333  
mb          fam2         444

Пожалуйста, помогите !!

Ответы [ 3 ]

5 голосов
/ 16 июля 2011

Вам не нужен CTE. Вот решение, которое не использует CTE

SELECT ver, fam,
    STUFF((
      SELECT  ', ' + mm
      FROM #prd AS prd
      WHERE p.ver = prd.ver
        AND p.fam = prd.fam
      ORDER BY mm
      FOR XML PATH('')
    ), 1, 2, '') AS MM
FROM #prd AS p
GROUP BY ver, fam

Если вам нужно, чтобы это был CTE, попробуйте это

;WITH prd_CTE AS
    (
    SELECT ver, fam,
        STUFF((
          SELECT  ', ' + mm
          FROM #prd AS prd
          WHERE p.ver = prd.ver
            AND p.fam = prd.fam
          ORDER BY mm
          FOR XML PATH('')
        ), 1, 2, '') AS MM
    FROM #prd AS p
    GROUP BY ver, fam
    )
SELECT *
FROM prd_CTE
3 голосов
/ 16 июля 2011

Версия CTE, в которой не используется for xml path('')

;with cte1 as
(
  select *,
         row_number() over(partition by ver, fam order by mm) as rn
  from #prd       
),
cte2 as
(
  select ver,
         fam,
         cast(mm as varchar(max)) as mm,
         rn
  from cte1
  where rn = 1
  union all
  select c1.ver,
         c1.fam,
         c2.mm+','+c1.mm,
         c1.rn
  from cte1 as c1
    inner join cte2 as c2
      on c1.rn = c2.rn + 1 and
         c1.ver = c2.ver and
         c1.fam = c2.fam
),
cte3 as
(
  select ver,
         fam,
         mm,
         row_number() over(partition by ver, fam order by rn desc) as rn 
  from cte2
)
select ver,
       fam,
       mm
from cte3
where rn = 1
0 голосов
/ 16 июля 2011

Вы можете использовать пользовательскую функцию, которая принимает "ver" в качестве параметра и возвращает разделенную запятую MM, или вы можете использовать данные

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...