2010-08-16 5 views
3

여러 SQL 필드를 하나의 출력 행으로 결합

과 같은 SQL 테이블이 있습니다. 값
1 | 사용자 이름 | 마리우스
1 | Fubar

출력을 다음과 같이 만들고 싶습니다.

1 | 마리우스 | Fubar

어쩌면 나는 그것을보기에는 너무 피곤할 수도 있고, 너무 복잡해 보이지 않을 수도 있지만, 나는 그것을 알아낼 수없는 것 같습니다. 어떤 도움을 주셔서 감사합니다.

답변

3

왜 자기 조인을 사용하지 않습니까? :

select u1.userid, u1.value, u2.value 
from yourtable u1 
inner join yourtable u2 on u2.userid=u1.userid 
where u1.attribute='Username' and u2.attribute='Password'; 
+0

내 시나리오에서 매우 짧고 효과적인 해결책, 대단히 감사합니다! – Marius

0

편집 : 결과 당

한 열 : 동일한 사용자 ID로 여러 속성을 결합하려고하면

가이 같은 것입니다 :

짧은 쿼리 (한 아이디) : 귀하의 예제 데이터를

declare @concattedtext varchar(1000) 

SELECT @concattedtext=coalesce(@concattedtext + '|', '') + Value 
FROM #users WHERE UserID=1 

SELECT @concattedtext 

결과 :

1 | Marius | Fubar 

전체 쿼리 (모든 사용자 ID의)

-- Your source table 
CREATE Table #users (UserID int, Attribute varchar(50), Value varchar(50)) 
-- some entries 
INSERT into #users (UserID, Attribute, Value) 
VALUES (1, 'Test1', 'attr1') 
INSERT into #users (UserID, Attribute, Value) 
VALUES (1, 'Test2', 'attr2') 
INSERT into #users (UserID, Attribute, Value) 
VALUES (1, 'Test3', 'attr3') 
INSERT into #users (UserID, Attribute, Value) 
VALUES (2, 'Test4', 'attr4') 

-- ids table variable (for distinct UserID's) 
DECLARE @ids TABLE 
(
rownum int IDENTITY (1, 1) Primary key NOT NULL, 
UserID int 
) 

-- Output table variable 
DECLARE @out TABLE 
(
rownum int IDENTITY (1, 1) Primary key NOT NULL, 
UserID int, 
ConcatText varchar(1000) 
) 

-- get distinct id's 
INSERT INTO @ids(UserID) 
SELECT DISTINCT(UserID) FROM #users 

-- Foreach vars 
declare @RowCnt int 
declare @MaxRows int 
select @RowCnt = 1 
select @MaxRows=count(*) from @ids 

-- UserID 
declare @id int 
declare @concattedtext varchar(1000) 

-- process each id 
while @RowCnt <= @MaxRows 
begin 
SET @id = 0 

SELECT @id=UserID 
FROM @ids WHERE [email protected] 

SET @concattedtext = CONVERT(nvarchar(50), @id) 
FROM @ids WHERE [email protected] 

SELECT @concattedtext=coalesce(@concattedtext + '|', '') + Value 
FROM #users WHERE [email protected] 

INSERT INTO @out(UserID, ConcatText) 
VALUES (@id, @concattedtext) 

-- next UserID 
Select @RowCnt = @RowCnt + 1 
end 

SELECT * FROM @out 

DROP TABLE #users 

결과 :

rownum|UserID|ConcatTex 
1  | 1 |1|attr1|attr2|attr3 
2  | 2 |2|attr4 
DROP TABLE #users 

당신은 당신의 요청 순서대로 매개 변수를 얻을 수있는 정렬 필드를해야 할 수도 있습니다.

여러 열

귀하의 데이터는 여러 열이있는 테이블을 얻을 수 좋아하면 속성의 동일한 수를 가질 필요가있다. 그리고 당신은 여전히 ​​주문에주의를 기울일 필요가 있습니다.

이 경우 그룹 기준의 하드 코드 된 검색어가 선택됩니다.

+0

미안하지만, 이러한 다운 슬래시는 열을 구분하기위한 것입니다. 내 문제는 두 줄 이상의 필드가 하나의 행에 반환되기를 원한다는 것입니다. – Marius

+0

하지만이 작업을 수행해야합니다. 원하는 것은 무엇이든 다운 슬래시를 교환하십시오. 전에는이 사실을 언급하지 않았습니다. –

+0

그래서 2 열 테이블 또는 다중 열 테이블을 가져와야합니까? 두 번째 것은 어렵습니다. 이를 수행하려면 여러 쿼리를 수행해야합니다. E.G. sql while 및 UserId로 그룹화됩니다.이 세부 정보를 반영하도록 질문을 편집하십시오. –

1

겠습니까 뭔가 같은 ...

SELECT userID, 
     GROUP_CONCAT (Value SEPARATOR '|') 
    FROM my_table 
    GROUP BY UserID; 

당신이 찾고있는 무슨 일?

0

데이터를 그대로 유지하면 크로스 탭 쿼리를 수행하고 행을 열로 피벗해야합니다. Microsoft SQL Server를 사용하는 경우 "크로스 탭 쿼리"와 온라인 설명서의 피벗 연산자를 확인하십시오.

관련 문제