Вы можете попробовать следующий запрос, используя функции stuff()
, len()
и внутреннее объединение.
create table #Region (Region Varchar(50), CountryName Varchar(50), ProductID int)
insert into #Region values
('Latin America/Caribbean', 'BAHAMAS', 21),
('Europe', 'AZERBAIJAN', 23),
('Europe', 'AZERBAIJAN', 24),
('Latin America/Caribbean', 'BAHAMAS', 21),
('Middle East/Africa', 'BAHRAIN', 43),
('Europe', 'BALI', 21),
('Asia Pacific', 'BANGLADHESH', 25),
('Asia Pacific', 'BANGLADHESH', 256),
('Latin America/Caribbean', 'BARBADOS', 20),
('Europe', 'BELARUS', 15),
('Europe', 'BELGIUM', 24)
Теперь фактический запрос выглядит так, как показано ниже:
Select a.Region, a.CountryName, b.ProductID,
Case when LEN(b.ProductID) - LEN(REPLACE(b.ProductID, ',',''))+1
>
LEN(a.CountryName) - LEN(REPLACE(a.CountryName, ',',''))+1
then
LEN(b.ProductID) - LEN(REPLACE(b.ProductID, ',',''))+1
else
LEN(a.CountryName) - LEN(REPLACE(a.CountryName, ',',''))+1
end as RecordCount
from(
Select
g1.Region
, stuff((
select distinct ', ' + g.CountryName
from #Region g
where g.Region = g1.Region
for xml path('')
),1,2,'') as CountryName
from #Region g1
group by g1.Region
)a inner join
(
Select
g1.Region
, stuff((
select distinct ', ' + Cast(g.ProductID as CHAR(3))
from #Region g
where g.Region = g1.Region
for xml path('')
),1,2,'') as ProductID
from #Region g1
group by g1.Region
)b on a.Region = b.Region
Выходные данные, как показано ниже.
Region CountryName ProductID RecordCount
-----------------------------------------------------------------------------------
Asia Pacific BANGLADHESH 25 , 256 2
Europe AZERBAIJAN, BALI, BELARUS, BELGIUM 15 , 21 , 23 , 24 4
Latin America/Caribbean BAHAMAS, BARBADOS 20 , 21 2
Middle East/Africa BAHRAIN 43 1
Вы можете найти живую демонстрацию Здесь .