복붙노트

[SQL] SQL 동적 열 이름을 생성하는?

SQL

SQL 동적 열 이름을 생성하는?

그래서 같은로서 '의 ColumnName'문을 내가 열 이름에 피벗 행 값을 시도하고 현재 내가 SUM (케이스 ...) 사용하고 쿼리를 가지고 :

SELECT
SKU1,
SUM(Case When Sku2=157 Then Quantity Else 0 End) As '157',
SUM(Case When Sku2=158 Then Quantity Else 0 End) As '158',
SUM(Case When Sku2=167 Then Quantity Else 0 End) As '167'
FROM
OrderDetailDeliveryReview
Group By
OrderShipToID,
DeliveryDate,
SKU1 

위의 쿼리는 잘 작동하고 내가 필요 정확히 저를 제공합니다. 그러나, 나는이 SUM을 쓰고 있어요 (사례 ... 다음 쿼리의 결과에 따라 손으로 문 :

Select Distinct Sku2 From OrderDetailDeliveryReview 

저장 프로 시저 내에서 T-SQL을 사용하는 방법은, 내가 동적으로 선택 고유 Sku2 OrderDetailDeliveryReview에서 쿼리 (케이스 ... 문을 SUM을 생성하고 생성 된 SQL 코드를 실행할 수 있나요?

해결법

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

    1.메타 데이터에서 동적 피벗 SQL을 생성하여 수년에 걸쳐이 많이 대답하는 데,이 예제를 보라 :

    메타 데이터에서 동적 피벗 SQL을 생성하여 수년에 걸쳐이 많이 대답하는 데,이 예제를 보라 :

    SQL 동적 피벗 - 열을 주문하는 방법

    열의 알 수없는 번호에 SQL Server 2005의 피벗

    SQL 쿼리 또는 뷰 "동적 열"보여줄 것이다 무엇

    T-SQL에서 XML 컬럼의 속성에 I 피벗을 어떻게

    어떻게 SQL 문에 DRY 원칙을 적용하는 피벗 개월

    특정 경우 (대신 SQL 서버 2005의 PIVOT 기능의 ANSI 피벗 사용) :

    DECLARE @template AS varchar(max)
    SET @template = 'SELECT 
    SKU1
    {COLUMN_LIST}
    FROM
    OrderDetailDeliveryReview
    Group By
    OrderShipToID,
    DeliveryDate,
    SKU1
    '
    
    DECLARE @column_list AS varchar(max)
    SELECT @column_list = COALESCE(@column_list, ',') + 'SUM(Case When Sku2=' + CONVERT(varchar, Sku2) + ' Then Quantity Else 0 End) As [' + CONVERT(varchar, Sku2) + '],' 
    FROM OrderDetailDeliveryReview
    GROUP BY Sku2
    ORDER BY Sku2
    
    Set @column_list = Left(@column_list,Len(@column_list)-1)
    
    SET @template = REPLACE(@template, '{COLUMN_LIST}', @column_list)
    
    EXEC (@template)
    
  2. ==============================

    2.내가 SO 검색 엔진 알고 완벽하지 않지만 귀하의 질문은 SQL 서버 PIVOT 열 데이터에 답하고있다. 또한 SQL에서 크로스 탭 쿼리 및 피벗 테이블 만들기를 참조하십시오.

    내가 SO 검색 엔진 알고 완벽하지 않지만 귀하의 질문은 SQL 서버 PIVOT 열 데이터에 답하고있다. 또한 SQL에서 크로스 탭 쿼리 및 피벗 테이블 만들기를 참조하십시오.

  3. ==============================

    3.당신이 어떤 테이블에서 모든 동적으로 당겨 수있을 때 왜 열심히 열 이름을 코딩 사용합니까?

    당신이 어떤 테이블에서 모든 동적으로 당겨 수있을 때 왜 열심히 열 이름을 코딩 사용합니까?

    UNPIVOT과 유착을 사용하여 동적으로 나열하는 기록의 모든 레코드에 대한 모든 테이블의 컬럼 및 관련 열 값의 목록을 당겨 행에 의해 값으로 열 이름의 목록에 결합 할 수 있습니다. 여기에 코드입니다. 그냥 데이터베이스 및 테이블 이름을 놓습니다. 열 / 값 테이블은 SQL 서버에서 당신을 위해 생성됩니다. 당신은 SQL 변형 또는 텍스트 문자열로 변환 할 열 값의 공유 열을 얻기 위해, 명심하십시오. 그러나 좋은 방법은 우리의 동안 루프 또는 커서로 열 이름과 유형을 일치하는 값의 샘플 열 목록을 얻을 수 있습니다. 그것의 꽤 빨리 :

    -- First get a list of all known columns in your database, dynamically...
    DECLARE @COLUMNS nvarchar(max)
    SELECT @COLUMNS = 
    
    CASE
     WHEN A.DATA_TYPE = 'nvarchar' OR A.DATA_TYPE = 'ntext' THEN 
    COALESCE(@COLUMNS + ',','') + 'CAST(CONVERT(nvarchar(4000),['+A.[name]+']) AS sql_variant) AS ['+A.[name]+']'
     WHEN A.DATA_TYPE = 'datetime' OR A.DATA_TYPE = 'smalldatetime' THEN 
    COALESCE(@COLUMNS + ',','') + 'CAST(CONVERT(nvarchar,['+A.[name]+'],101) AS sql_variant) AS ['+A.[name]+']'
     ELSE
     COALESCE(@COLUMNS + ',','') + 'CAST(['+A.[name]+'] AS sql_variant) AS ['+A.[name]+']'
     END
    
    FROM
    (
     SELECT
     A.name,
     C.DATA_TYPE
     FROM YOURDATABASENAME.dbo.syscolumns A
     INNER JOIN YOURDATABASENAME.dbo.sysobjects B ON B.id = A.id
     LEFT JOIN
     (
     SELECT 
    COLUMN_NAME,
     DATA_TYPE
     FROM YOURDATABASENAME.INFORMATION_SCHEMA.COLUMNS 
    WHERE TABLE_NAME = 'YOURTABLENAME' 
    ) C ON C.COLUMN_NAME = A.name
     WHERE B.name = 'YOURTABLENAME'
     AND C.DATA_TYPE <> 'timestamp' 
    ) A
    -- Test that the formatted columns list is returned...
    --SELECT @COLUMNS
    
    -- This gets a second string list of all known columns in your database, dynamically...
    DECLARE @COLUMNS2 nvarchar(max)
    SELECT @COLUMNS2 = COALESCE(@COLUMNS2 + ',','') + '['+A.[name]+']'
    FROM
    (
     SELECT
     A.name,
     C.DATA_TYPE
     FROM YOURDATABASENAME.dbo.syscolumns A
     INNER JOIN YOURDATABASENAME.dbo.sysobjects B ON B.id = A.id
     LEFT JOIN
     (
     SELECT 
    COLUMN_NAME,
     DATA_TYPE
     FROM YOURDATABASENAME.INFORMATION_SCHEMA.COLUMNS 
    WHERE TABLE_NAME = 'YOURTABLENAME' 
    ) C ON C.COLUMN_NAME = A.name
     WHERE B.name = 'YOURTABLENAME'
     AND C.DATA_TYPE <> 'timestamp' 
    ) A
    -- Test that the formatted columns list is returned...
    --SELECT @COLUMNS2
    
    
    -- Now plug in the list of the dynamic columns list into an UNPIVOT to get a Column Name / Column Value list table...
    DECLARE @sql nvarchar(max)
    SET @sql = 
    '
    SELECT
    ColumnName,ColumnValue
    FROM
    (
    SELECT
    '+@COLUMNS+'
    FROM YOURDATABASENAME.dbo.YOURTABLENAME  
    WHERE CHANGE_ID IN (SELECT ChangeId FROM YOURDATABASENAME.dbo.OperatorProcess WHERE OperatorProcessID = 3)
    ) AS SourceTable
    UNPIVOT
    (
    ColumnValue FOR ColumnName IN ('+@COLUMNS2+')
    ) AS PivotTable
    '
    
    EXEC (@sql)
    
  4. ==============================

    4.

    -- Darshankar Madhusudan i can do dynamic columnheading table easly...
    --thanks  
    declare @incr int = 1,
            @col  int,
            @str varchar(max),
            @tblcrt varchar(max),
            @insrt varchar(max),
            set @tblcrt = 'DECLARE @Results table ('        
            set @str = ''      
            set @insrt = ''  
        select @col = max(column_id) From tempdb.sys.all_columns    where object_id = object_id('tempdb.dbo.#aaa')
        while @incr <= @col
            BEGIN
                 SELECT @STR = @STR    +case when @incr = 1 then '''' else ',''' end +rtrim(ltrim(NAME))+'''' FROM TEMPDB.SYS.ALL_COLUMNS    WHERE OBJECT_ID = OBJECT_ID('TEMPDB.DBO.#AAA') and column_id = @incr 
                 set @tblcrt = @tblcrt + case when @incr = 1 then '' else ',' end + 'Fld'+CAST(@incr as varchar(3)) +' varchar(50)'
                 set @insrt = @insrt   + case when @incr = 1 then '' else ',' end + 'Fld'+CAST(@incr as varchar(3))
                 SET @INCR = @INCR + 1 
            END 
            set @tblcrt = @tblcrt + ')'
            set @insrt = 'insert into @Results('+@insrt+') values (' + @STR +')'
            set @tblcrt = @tblcrt+ ';' + @insrt + 'select * from @Results '
    exec(@tblcrt)
    
  5. from https://stackoverflow.com/questions/2554826/dynamic-sql-to-generate-column-names by cc-by-sa and MIT license