2016-09-26 1 views
-1

У меня есть запрос T-SQL, который возвращает результат двух строк с одинаковым именем контакта, но в одном из столбцов отличается:T-SQL-запрос добавить столбцы

Contact Name BuildingID ClassID 
------------------------------------ 
XXXX    720   3505 
XXXX    720   3650 

мне нужно объединить оба ClassID значения в столбце ClassID как это:

Contact Name BuildingID ClassID 
---------------------------------------- 
XXXX    720  3505;3650 
+0

Это SQL антипаттерн. Одно поле должно содержать одно значение. почему ты хочешь сделать это? – MatBailie

+1

Возможный дубликат [Как сделать запрос с группой \ _concat в sql-сервере] (http://stackoverflow.com/questions/17591490/how-to-make-a-query-with-group-concat-in-sql -сервер) --- Объединение нескольких значений в одно поле в представлении является довольно распространенным требованием. Некоторые РСУБД имеют встроенную функциональность (например, Group_Concat в MySQL или string_agg в Oracle). С SQL Server вы должны использовать 'stuff()' и 'cross apply', чтобы выполнить задание. Проверьте эту ссылку, и она должна приблизиться к тому, что вам нужно. – JNevill

ответ

-1

Попробуйте этот запрос:

SELECT GROUP_CONCAT(ClassID) 
FROM `table` 
GROUP BY BuildingID 
+1

OP использует tsql, а не MySQL. – JNevill

0

Вы можете попробовать, как это, используя вещи и XML Path

SELECT ContactName, BuildingID, 
    STUFF((SELECT ','+CONVERT(varchar(20),classid) FROM Contacts where contactname= c.ContactName and BuildingId = c.BuildingID 
      FOR XML PATH('')),1,1,'') AS ClassId 
FROM Contacts C 
Group by ContactName, BuildingId 
0
CREATE TABLE #XX 
(
    ContactName VARCHAR(10) , 
    BuildingId INT, 
    ClassId INT 
) 


INSERT INTO #XX VALUES ('XXXX',720,3505) 
INSERT INTO #XX VALUES ('XXXX',720,3650) 


SELECT DISTINCT ContactName,BuildingId,STUFF((
       SELECT ';' + CAST(ClassId AS VARCHAR(10)) 
       FROM #XX FOR XML PATH('') 
       ), 1, 1, '') AS ClassId 
       FROM #XX 
0

Если вам это нужно для более чем 1 контакт & здания, то это должно работать:

select [Contact Name], BuildingId, 
STUFF(
    ( SELECT concat(';',ClassId) 
     FROM YourTable t2 
     WHERE t1.[Contact Name] = t2.[Contact Name] 
     AND t1.BuildingId = t2.BuildingId 
     ORDER BY ClassId 
     FOR XML PATH('') , TYPE 
).value('.', 'varchar(max)'),1,1,'' 
) as ClassIds 
from YourTable t1 
--where [Contact Name] = 'XXXX' and BuildingId = 720 
group by [Contact Name], BuildingId; 

и получить его в переменная только для 1 компании & здание?
Вот маленькая хитрость:

declare @ClassIds varchar(max); 
declare @ContactName varchar(30) = 'XXXX'; 
declare @BuildingId int = 720;  

select @ClassIds = concat(@ClassIds+';',ClassId) 
from YourTable 
where [Contact Name] = @ContactName and BuildingId = @BuildingId 
order by ClassId; 

select @ContactName as [Contact Name], @BuildingId as BuildingId, @ClassIds as ClassIds; 
Смежные вопросы