본문 바로가기

Prog.Lang. or Query/SQL

[SQLServer] Convert rows to a column

ref: http://www.simple-talk.com/sql/t-sql-programming/concatenating-row-values-in-transact-sql/

sqlserver rows to column

SELECT p1.CategoryId,
       ( SELECT ProductName + ',' 
           FROM Northwind.dbo.Products p2
          WHERE p2.CategoryId = p1.CategoryId
          ORDER BY ProductName
            FOR XML PATH('') ) AS Products
      FROM Northwind.dbo.Products p1
GROUP BY CategoryId ;

대충 보면 이해가지?

안가면 테이블 변수 바꿔서 돌려보길 바랍니다.

뭐 대충 안에있는거 xml 화 해서 포맷 없이 모으고 그걸 바깥에  테이블이랑 매핑해서 보여줌?

정도 지 않을까 싶다. 정확한 정보와 그 밖의 다른 정보를 위해서는 위 URL에 접속해 보길 바란다.

mssql 은 과연 이방법 뿐일까?

오라클은 ListAgg() 함수를 사용하면 그냥 바로 볼 수 있는데.

아니면 rownumber와 depth 를 줘서 구조화 기능을 약간 꽈서 사용하는 법도 있고,

개인 테스트 완료.

모르는 점은 댓글로.

성공한 사항도 댓글로 달아 공유해주면 좋겠다.

개인 테스트 쿼리

 select a.Sabun, a.Name, aa, substring(a.authlist,1,len(a.authlist)-1) 
 
from (
 
select 
 
a.sabun, 
 
a.name,  '11' as aa,
 
(select ''''+ convert(varchar,c.CategoryMainCode)+''', ' 
 
from dbo.tb_authority b, dbo.tb_maincategory c
 
where a.userid = b.userid and b.orgcode = c.orgcode
 
order by 1
 
for XML path('')) authlist
 
 from dbo.TB_User a
 
 where 1=1
 
 group by 
 
 a.sabun, 
 
 a.name,
 
 a.UserID
 
 ) a
 
 where a.authlist > '' and a.Sabun = '120000340' and a.Sabun= '120000340';

select a.Sabun, a.Name, a.OrgCode, ''''+substring(a.authlist,1,len(a.authlist)-1) , a.log
 
from (
 
select 
 
a.sabun, 
 
a.name, '11' as  OrgCode, 
 
(select convert(varchar,c.categorymaincode)+', '
 
from dbo.tb_authority b, dbo.tb_Maincategory c
 
where a.userid = b.userid and b.orgcode=c.orgcode
 
order by 1
 
for XML path('')) authlist, '2' as log
 
from dbo.TB_User a
 
where 1=1
 
group by 
 
a.sabun, 
 
a.name,
 
a.UserID
 
) a
 
where a.authlist > '' and a.Sabun =  ':USER' and \
 
a.Sabun=':PASSWORD';