SQL Server - объединить строки в один столбец и принять максимальное количество - PullRequest
0 голосов
/ 15 февраля 2019

Я работаю над запросом, который будет собирать данные из нескольких таблиц и отображать их.

Данные выглядят следующим образом:

Region                  CountryName  ProductID
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

И я хочу получить такой набор результатов, как этот

Region                  CountryName                         ProductID       RecordCount
Latin America/Caribbean BAHAMAS,BARBADOS                    21,20           2
Europe                  AZERBAIJAN,BALI,BELARUS,BELGIUM     23,15,24        4
Asia Pacific            BANGLADHESH                         25,26           2
Middle East/Africa      BAHRAIN                             43              1

Я пытался ниже Query объединить CountryName и ProductID, но яхотите значение счетчика 4-го столбца, которое всегда является максимальным ч / б столбцы Product & Country.(т. е. если в столбце CountryName указано 4 страны, а в столбце Product - 2, то мой счет должен быть равен 4 (2-я строка в приведенном выше наборе результатов), а если столбец Product имеет два идентификатора, а в стране указано одно название страны, то мой счет должен быть равен 2 (3-я строка).в приведенном выше результате), и он должен быть сгруппирован по регионам.

SELECT RegionName,
STUFF((SELECT DISTINCT ', ' + CAST(COUNTRY AS NVARCHAR(20)) FROM Countries RX WHERE RX.CountryCode = PD.CountryCode FOR XML PATH('')),1,1,'') AS CountryList,
STUFF((SELECT DISTINCT ', ' + CAST(ProductID AS NVARCHAR(5)) FROM Product RP WHERE RP.ProductID = PD.ProductID FOR XML PATH('')),1,1,'') AS ProductList,
Count(?) AS recCount
FROM Countries CN WITH (NOLOCK)
INNER JOIN Product PD WITH (NOLOCK)
ON PD.CountryCode=CN.CountryCode 
GROUP BY RegionName

У кого-нибудь есть идеи, как это сделать?

1 Ответ

0 голосов
/ 15 февраля 2019

Вы можете попробовать следующий запрос, используя функции 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

Вы можете найти живую демонстрацию Здесь .

...