2016-07-07 2 views
0

Я пытаюсь сгруппировать по 2 полям и вернуть третье поле, которое представляет собой конкатенацию значений другого поля, имеющего общие 2, с заданным Код товара. Вот мои данные:T-SQL Как сгруппировать по двум полям и объединить другое

ProductID Currency Price Territory 
1   USD  6.99 US 
1   EUR  4.99 GR 
1   EUR  4.99 HU 
1   EUR  4.99 LT 
2   USD  7.99 US 
2   EUR  5.99 GR 
2   EUR  5.99 HU 

Я хотел бы результаты, чтобы вернуться, как это:

ProductID Currency Price Territories 
1   USD  6.99 US 
1   EUR  6.99 GR, HU, LT 

Я могу вытащить CurrentY и цену столбцов, но не могут сцепить территорий, которые они имеют в общем :

SELECT Currency, Price 
FROM TerritoryPricing 
WHERE ProductID = 1 
GROUP BY Currency, Price 

Как я могу конкатенировать территории?

+0

Google: "SQL Server агрегатный конкатенации" –

+0

смотрите эту статью http://stackoverflow.com/questions/3368942/grouped-string-aggregation-listagg-for-sql-server – are

+0

http://sqlperformance.com/2014/08/t-sql-queries/sql-server-grouped-concatenation –

ответ

0

Вы можете использовать обработку XML SQL для генерировать конкатенированные списки с SQL 2000 и выше:

create table #TerritoryPricing (ProductID int, Currency varchar(3), Price decimal(10,2), Territory varchar(2)) 
insert into #TerritoryPricing values (1,'USD',6.99,'US') 
insert into #TerritoryPricing values (1,'EUR',4.99,'GR') 
insert into #TerritoryPricing values (1,'EUR',4.99,'HU') 
insert into #TerritoryPricing values (1,'EUR',4.99,'LT') 
insert into #TerritoryPricing values (2,'USD',7.99,'US') 
insert into #TerritoryPricing values (2,'EUR',5.99,'GR') 
insert into #TerritoryPricing values (2,'EUR',5.99,'HU') 

SELECT Currency, Price, 
    SUBSTRING(
     (SELECT (',' + ltrim(rtrim(Territory))) 
     FROM #TerritoryPricing t2 
     WHERE t1.Currency = t2.Currency 
      and t1.Price = t2.Price 
      and ProductID = 1 
     ORDER BY t2.Territory 
     FOR XML PATH('') 
     ), 2, 8000) Territories 
FROM #TerritoryPricing t1 
WHERE ProductID = 1 
GROUP BY Currency, Price 
+0

Это замечательно, спасибо. Единственное, что мне пришлось добавить, это «WHERE ProductID = 1» в подзапросе WHERE. Благодаря! –

0

вы можете использовать Concat:

SELECT ProductID, Currency, Price, CONCAT(Territory) 
GROUP BY territory 
FROM employee_tbl; 

или создать функцию с Colace что-то вроде как этот

CREATE FUNCTION [dbo].[terr] 
(
    @territoryID int 
) 
RETURNS varchar(max) 
AS 
BEGIN 
    declare @output varchar(max) 
    select @output = COALESCE(@output + ', ', '') + territory 
    from TerritoryPricing 
    where territoryid = @territoryID 

    return @output 
END 

GO 

SELECT UserID, [dbo].terr(territoryID) 
FROM TerritoryPricing 
GROUP BY territory 

GO 
0

Теста этот код

DECLARE @S VARCHAR(8000) 
SELECT 
    Currency, 
    Price , 
    Territories = (Select @S = @S + Territory FROM TerritoryPricing as T2 WHERE T1.Currency = T2.Currency AND T1.Price = T2.Price) , 
    Empty = (select @S ='') 
FROM TerritoryPricing as T1 
WHERE ProductID = 1 
GROUP BY Currency, Price 
Смежные вопросы