2009-10-16 9 views
8

그래서 저는 주위를 둘러 보았고 제 문제와 비슷한 것을 발견했지만 실제 해결책을 얻으려면 더 많은 도움이 필요합니다.행을 열로 선택하는 방법은 무엇입니까?

두 개의 데이터 열을 반환하는 쿼리를 만들려고합니다. 첫 번째 열은 열 이름의 목록이어야하며 두 번째 열은 해당 열의 값이어야합니다.

시각적으로 내가이 달성하기 위해 동적 SQL을 요구하는 것이라는 것을 확신이

Column1  Column2 
-------  ------- 
columnA  value_of_columnA 
columnB  value_of_columnB 
...   ... 

처럼 보일 것입니다,하지만 난 쿼리 작성을 시작하는 방법을 모른다.

도움을 주시면 감사하겠습니다.

+0

귀하의 질문에 실제 세부 사항이 없습니다 - 당신은 어떤 테이블을 다루고 있으며, 어떤 열 데이터 유형입니까? SQL Server 버전, pls. –

+1

구체적으로 어떤 버전의 SQL Server입니까? 그리고 당신은 1 행의 데이터만을 가지고 계신 것입니까, 아니면 열 1이 열 이름이고 다른 모든 열은 해당 열의 데이터입니까? –

+0

필자는 행을 열에 피벗시키고 행을 열로 피벗시키고 싶다는 것을 이해할 수 있습니까? 당신은 실제로 무엇을하려고합니까? –

답변

5

처럼 뭔가를 할 수 있지만, 내 예에 난 그냥 테스트를 만듭니다. @YourTableName 내에 테이블 이름을 설정해야합니다. 또한 결과를 한 행으로 제한하려면 @YourTableWhere를 설정해야합니다. 그렇지 않으면 여러 행이 혼합되어 출력이 이상하게 보입니다.

시도이 :

BEGIN TRY 
CREATE TABLE YourTestTable 
(RowID  int primary key not null identity(1,1) 
,col1  int null 
,col2  varchar(30) 
,col3  varchar(20) 
,col4  money 
,StatusValue char(1) 
,xyz_123  int 
) 
INSERT INTO YourTestTable (col1,col2,col3,col4,StatusValue,xyz_123) VALUES (1234,'wow wee!','this is a long test!',1234.56,'A',98765) 
INSERT INTO YourTestTable (col1,col2,col3,col4,StatusValue,xyz_123) VALUES (543,'oh no!','short test',0,'I',12) 

END TRY BEGIN CATCH END CATCH 

select * from YourTestTable 


DECLARE @YourTableName varchar(1000) 
DECLARE @YourTableWhere varchar(1000) 
DECLARE @YourQuery  varchar(max) 

SET @YourTableName='YourTestTable' 
set @YourTableWhere='y.RowID=1' 

SELECT 
    @YourQuery = STUFF(
         (SELECT 
          ' UNION ' 
          + 'SELECT '''+COLUMN_NAME+''', CONVERT(varchar(max),'+COLUMN_NAME+') FROM '[email protected]+' y'+ISNULL(' WHERE '[email protected],'') 
          FROM INFORMATION_SCHEMA.COLUMNS 
          WHERE table_name = @YourTableName 
          FOR XML PATH('') 
         ), 1, 7, '' 
        ) 

PRINT @YourQuery 

EXEC (@YourQuery) 

출력 : SQL Server 2000의 호환성을 위해

RowID  col1  col2       col3     col4     StatusValue xyz_123 
----------- ----------- ------------------------------ -------------------- --------------------- ----------- ----------- 
1   1234  wow wee!      this is a long test! 1234.56    A   98765 
2   543   oh no!       short test   0.00     I   12 

SELECT 'RowID', CONVERT(varchar(max),RowID) FROM YourTestTable y WHERE y.RowID=1 UNION SELECT 'col1', CONVERT(varchar(max),col1) FROM YourTestTable y WHERE y.RowID=1 UNION SELECT 'col2', CONVERT(varchar(max),col2) FROM YourTestTable y WHERE y.RowID=1 UNION SELECT 'col3', CONVERT(varchar(max),col3) FROM YourTestTable y WHERE y.RowID=1 UNION SELECT 'col4', CONVERT(varchar(max),col4) FROM YourTestTable y WHERE y.RowID=1 UNION SELECT 'StatusValue', CONVERT(varchar(max),StatusValue) FROM YourTestTable y WHERE y.RowID=1 UNION SELECT 'xyz_123', CONVERT(varchar(max),xyz_123) FROM YourTestTable y WHERE y.RowID=1 

----------- ------------------------ 
col1  1234 
col2  wow wee! 
col3  this is a long test! 
col4  1234.56 
RowID  1 
StatusValue A 
xyz_123  98765 

편집

, 당신은 VARCHAR과 VARCHAR (최대)를 대체 할 수 있어야한다을 (8000) 위의 코드에서 SELECT @YourQuery 쿼리 대신 다음을 사용하십시오.

이 SQL 서버의 XML 기능을 사용하지 않기 때문에
SELECT 
    @YourQuery=ISNULL(@YourQuery+' UNION ','') 
     + 'SELECT '''+COLUMN_NAME+''', CONVERT(varchar(max),'+COLUMN_NAME+') FROM '[email protected]+' y'+ISNULL(' WHERE '[email protected],'') 
    FROM INFORMATION_SCHEMA.COLUMNS 
    WHERE table_name = @YourTableName 
+0

정확히 내가 원하는 것 같습니다 ... 제외 ... MSSQL 2000 데이터베이스를 사용하고 있으므로 varchar (1000) 및 FOR XML PATH ('')를 사용하여 varchar (max)가 작동하지 않습니다.)도 작동하지 않습니다. 나는 그걸 어떻게 잡을 지 모르겠다. – Shaded

2
select column_name,* from information_schema.columns 
where table_name = 'TheTableName' 
order by ordinal_position 
0

당신은 항상이 모든 테이블에 대한 작업을해야이

SELECT 'Column_Name' AS ColumnName, 
    (SELECT TOP 1 Column_Name FROM Table tbl2 WHERE tbl.ID = tbl2.ID) 
FROM Table tbl 
0

My answer to this question (10)는 SQL Server 2000에보다 쉽게 ​​작동합니다 당신은 당신이 당신의 보고서 무엇을 당신이 제시하는 방법에 대한 매우 명확하지 않다 2005 년

0

그것으로 생성. 검색어 도구의 직접 결과를 사용하여 '보고서'를 생성 하시겠습니까? 어떤 경우에는 스크류 드라이버를 사용하여 못을 꽂으려고 시도하고 있습니다. 작업에 적합한 도구를 사용하십시오.

SQL 언어를 직접 사용하여 보고서를 생성하기 위해 프레젠테이션 데이터를 설정하지 마십시오. 정말 바보 같은 생각입니다. 으로 곧장 보고서를 작성한다고해서 이어야 함을 의미하지는 않습니다.

직접 작성하는 응용 프로그램이나 Crystal Reports와 같은 보고서 생성 도구를 사용하여 보고서를 생성해야합니다.

응용 프로그램 스스로 작성 : 커서 개체를 사용하여 데이터베이스를 쿼리하는 경우 해당 커서 개체에서 열 이름을 간단히 가져올 수 있습니다. 문제 해결됨.

보고서 생성 도구 : 일반적으로 보고서 생성 도구는 나타날 수있는 동적 데이터를 나타내는 기능을 제공합니다.

어느 쪽이든, 나는이 문제에 대한 귀하의 접근 방식을 재고해야한다고 생각합니다.

관련 문제