복붙노트

[SQL] 어떻게 행으로 열을 선택하려면?

SQL

어떻게 행으로 열을 선택하려면?

그래서, 주변 검색을 봤는데 나는 내 문제와 유사한 것을 발견했지만, 내가 진짜 해결책을 얻기 위해 더 많은 도움이 필요합니다.

나는 데이터의 2 열을 반환하는 쿼리를 생성하기 위해 노력하고있어, 첫 번째 열은 스스로 열 이름의 목록이어야하며, 두 번째는 해당 컬럼의 값이어야합니다.

시각적으로는 같을 것이다

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

나는 꽤 확신이 달성하기 위해 동적 SQL을 요구하는 것이라는 것을 해요,하지만 난 쿼리 작성을 시작하는 방법을 모른다.

어떤 도움에 감사드립니다!

해결법

  1. ==============================

    1.이것은 모든 테이블을 위해 작동해야하지만 내 예에 난 그냥 테스트를 만듭니다. 당신은 @YourTableName 내에서 테이블 이름을 설정해야합니다. 또한, 그렇지 않으면 출력이 함께 혼합 여러 행에 이상한 보이는, 한 행에 결과를 제한하는 @YourTableWhere를 설정해야합니다.

    이것은 모든 테이블을 위해 작동해야하지만 내 예에 난 그냥 테스트를 만듭니다. 당신은 @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 '+@YourTableName+' y'+ISNULL('  WHERE '+@YourTableWhere,'')
                                FROM INFORMATION_SCHEMA.COLUMNS
                                WHERE table_name = @YourTableName
                                FOR XML PATH('')
                           ), 1, 7, ''
                          )
    
    PRINT @YourQuery  
    
    EXEC (@YourQuery)
    

    산출:

    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
    

    편집하다

    SQL Server 2000의 호환성을 위해, 당신은 VARCHAR (8000)와 VARCHAR (최대)를 교체하고 위의 코드에서 SELECT @YourQuery 쿼리 대신이를 사용할 수 있어야합니다 :

    SELECT
        @YourQuery=ISNULL(@YourQuery+' UNION ','')
            + 'SELECT '''+COLUMN_NAME+''', CONVERT(varchar(max),'+COLUMN_NAME+') FROM '+@YourTableName+' y'+ISNULL('  WHERE '+@YourTableWhere,'')
        FROM INFORMATION_SCHEMA.COLUMNS
        WHERE table_name = @YourTableName
    
  2. ==============================

    2.

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

    3.당신은 항상 이런 식으로 뭔가를 할 수

    당신은 항상 이런 식으로 뭔가를 할 수

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

    4.이 SQL 서버 2005의 XML 기능을 사용하지 않기 때문에이 질문에 대한 내 대답은 SQL Server 2000에보다 쉽게 ​​작동합니다.

    이 SQL 서버 2005의 XML 기능을 사용하지 않기 때문에이 질문에 대한 내 대답은 SQL Server 2000에보다 쉽게 ​​작동합니다.

  5. ==============================

    5.당신은 당신의 보고서와 당신이 그것을 생성하는 제시하는 방법에 대한 매우 명확하지 않다. 당신은 당신의 "보고서"를 생성하는 쿼리 도구에서 직접 결과를 사용하고 있습니까? 이 경우에, 당신은 파운드에 드라이버를 사용하여 못을하려고합니다 ...이라고 생각되다. 작업에 적합한 도구를 사용합니다.

    당신은 당신의 보고서와 당신이 그것을 생성하는 제시하는 방법에 대한 매우 명확하지 않다. 당신은 당신의 "보고서"를 생성하는 쿼리 도구에서 직접 결과를 사용하고 있습니까? 이 경우에, 당신은 파운드에 드라이버를 사용하여 못을하려고합니다 ...이라고 생각되다. 작업에 적합한 도구를 사용합니다.

    SQL 언어는 직접 보고서를 생성하는 설정으로 프리젠 테이션 데이터를 사용할 수 없습니다. 정말, 바보 같은 생각이다. 당신이 바로 업 SQL 문을 사용하여 보고서를 작성할 수 있다는 사실은 당신이해야한다는 것을 의미하지 않습니다.

    당신은 정말 당신이 자신을 작성하는 것이 응용 프로그램, 또는 크리스탈 리포트와 같은 보고서 생성 도구를 사용하여 보고서를 생성해야한다.

    응용 프로그램은 자신에 의해 작성 : 데이터베이스를 조회 할 수 커서 객체를 사용하는 경우, 당신은 단순히 커서 객체에서 열 이름을 얻을 수 있습니다. 문제 해결됨.

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

    어느 쪽이든, 당신이 당신의 접근 방식을 재고 할 필요가 있다고 생각합니다.

  6. from https://stackoverflow.com/questions/1578500/how-to-select-columns-as-rows by cc-by-sa and MIT license