문제

SQL Server의 열로 행을 전환하는 기능이 있습니까 (MS-Access에서 가능)? 이 시설은 MS-Access에서 제공되지만 SQL Server에서는 사용할 수 없기 때문에 어려움을 겪었습니다. 이 기능이 SQL Server에 포함되지 않은 디자인입니까?

도움이 되었습니까?

해결책

예제 http://jdixon.dotnetdevelopersjournal.com/pivot_table_data_in_sql_server_2000_and_2005.htm 행 값이 무엇인지 미리 알고있는 경우에만 작동합니다. 예를 들어, 사용자 정의 속성이있는 엔티티가 있고 사용자 정의 속성이 하위 테이블의 행으로 구현되었으며, 여기서 자식 테이블은 기본적으로 가변/값 쌍이며 해당 변수/값 쌍이 구성 가능합니다.

color red
size  big
city  Chicago

작동하는 기술을 설명하겠습니다. 나는 그것을 사용했다. 나는 그것을 홍보하지는 않지만 작동합니다.

값이 무엇인지 모르는 데이터를 미리 회피하려면 열이없는 상태에서 온도 테이블을 작성하십시오. 그런 다음 커서를 사용하여 행을 통해 루프를 사용하여 각 변수에 대해 동적으로 빌드 된 "알터 테이블"을 발행하여 결국 온도 테이블에 열, 색상, 크기, 도시가 있도록합니다.

그런 다음 온도 테이블에 한 행을 삽입하고 변수, 값 쌍을 통해 다른 커서를 통해 업데이트 한 다음 일반적으로 부모 엔터티와 결합하여 선택한 경우 사용자 지정 변수/값 쌍이 내장 된 것처럼 보입니다. 원래 부모 엔터티의 열에서.

다른 팁

설명 된 커서 방법은 아마도 사용하기에 가장 적은 SQL 유사 일 것입니다. 언급 한 바와 같이, SQL 2005 및 ON에는 피벗이 잘 작동합니다. 그러나 이전 버전 및 비 MS SQL 서버의 경우 "Transact-SQL 최적화"의 Rozenshtein 메소드 (편집 : Out Off Print, Avavil. Amazon : http://www.amazon.com/optimizing-transact-sql-advanced-programming-techniques/dp/0964981203), 데이터는 피벗 및 비 봇 팅 데이터에 탁월합니다. 포인트 특성을 사용하여 행 기반 데이터를 열로 전환합니다. Rozenshtein은 몇 가지 사례를 설명합니다. 다음은 다음과 같습니다.

SELECT
    RowValueNowAColumn = 
       CONVERT(varchar,
           MAX(
          SUBSTRING(myTable.MyVarCharColumn,1,DATALENGTH(myTable.MyVarCharColumn)
       * CHARINDEX(sa.SearchAttributeName,'MyRowValue'))))
FROM
    myTable

이 방법은 Case 문을 사용하는 것보다 훨씬 효율적이며 다양한 데이터 유형 및 SQL 구현 (MS SQL뿐만 아니라)에서 작동합니다.

이런 종류의 것에 대해 소규모로 제한하는 것이 가장 좋습니다. SQL 2K를 사용하고 있고 피벗 기능이없는 경우, 저장된 Proc를 작성하여 작업을 수행해야합니다. Botch Rush job의 조금씩 원하는만큼 떼어냅니다. 아래를 SQL 창에 붙여 넣고 선호하는대로 하단의 exec를 편집하십시오. 생성되는 내용을 보려면 중간에 -S를 제거하십시오.

IF EXISTS (SELECT * FROM SYSOBJECTS WHERE XTYPE = 'P' AND NAME = 'USP_LIST_CONCAT')
DROP PROCEDURE USP_LIST_CONCAT
GO

CREATE PROCEDURE USP_LIST_CONCAT (@SourceTable NVARCHAR(1000) = '' ,@SplitColumn NVARCHAR(1000) = '' , @Deli NVARCHAR(10) = '', @KeyColumns NVARCHAR(2000) = '' , @Condition NVARCHAR(1000) = '')
AS
BEGIN
SET NOCOUNT ON

/* PROCEDURE CREATED 2010 FOR SQL SERVER 2000. SIMON HUGHES. */
/* NOTES: REMOVE --'s BELOW TO LIST GENERATED SQL. */

IF @SourceTable = '' OR @SourceTable = '?' OR @SourceTable = '/?' OR @SplitColumn = '' OR @KeyColumns = ''
BEGIN
PRINT 'Format for use:'
PRINT ' USP_LIST_CONCAT ''SourceTable'', ''SplitColumn'', ''Deli'', ''KeyColumn1,...'', ''Column1 = 12345 AND ...'''
PRINT ''
PRINT 'Description:'
PRINT 'The SourceTable should contain a number of records acting as a list of values.'
PRINT 'The SplitColumn should be the name of the column holding the values wanted.'
PRINT 'The Delimiter may be any single character or string ie ''/'''
PRINT 'The KeyColumn may contain a comma separated list of columns that will be returned before the concatenated list.'
PRINT 'The optional Conditions may be left blank or may include the following as examples:'
PRINT ' ''Column1 = 12334 AND (Column2 = ''ABC'' OR Column3 = ''DEF'')'''
PRINT ''
PRINT 'A standard list in the format:'
PRINT ' Store1, Employee1, Rabbits'
PRINT ' Store1, Employee1, Dogs'
PRINT ' Store1, Employee1, Cats'
PRINT ' Store1, Employee2, Dogs'
PRINT ''
PRINT 'Will be returned as:'
PRINT ' Store1, Employee1, Cats/Dogs/Rabbits'
PRINT ' Store1, Employee2, Dogs'
PRINT ''
PRINT 'A full ORDER BY and DISTINCT is included'
RETURN -1
END


DECLARE @SQLStatement NVARCHAR(4000)

SELECT @SQLStatement = '
DECLARE @DynamicSQLStatement NVARCHAR(4000)

SELECT @DynamicSQLStatement = ''SELECT '+@KeyColumns+', SUBSTRING(''

SELECT @DynamicSQLStatement = @DynamicSQLStatement + '' + '' + CHAR(10) +
'' MAX(CASE WHEN '+@SplitColumn+' = ''''''+RTRIM('+@SplitColumn+')+'''''' THEN '''''+@Deli+'''+RTRIM('+@SplitColumn+')+'''''' ELSE '''''''' END)''
FROM '+ @SourceTable +' ORDER BY '+@SplitColumn+'

SELECT @DynamicSQLStatement = @DynamicSQLStatement + '' ,2,7999) List'' + CHAR(10) + ''FROM '+ @SourceTable+''' + CHAR(10) +'''+CASE WHEN @Condition = '' THEN '/* WHERE */' ELSE 'WHERE '+@Condition END+ '''+ CHAR(10) + ''GROUP BY '+@KeyColumns+'''

SELECT @DynamicSQLStatement = REPLACE(@DynamicSQLStatement,''( +'',''('')

-- SELECT @DynamicSQLStatement -- DEBUG ONLY
EXEC (@DynamicSQLStatement)'

EXEC (@SQLStatement)

END
GO

EXEC USP_LIST_CONCAT 'MyTableName', 'ColumnForListing', 'Delimiter', 'KeyCol1, KeyCol2', 'Column1 = 123456'

SQL Server 2005의 Unpivot의 경우 좋은 기사를 찾았습니다.

SQL-SERVER 열 -SROWS-In-SERVER

다음 형식의 데이터가 있습니다

Survey_Question_ID

이메일 (사용자)

대답

1 개의 설문 조사에는 13 개의 질문이 있으며 내가 원하는 출력은

사용자 ---Survey_Question_ID1---Survey_Question_id2

이메일---답변---대답 ........

다음은 해결책입니다 SQL Server 2000, 원인 필드 데이터 유형은 원인입니다 텍스트.

DROP TABLE #tmp

DECLARE @tmpTable  TABLE
(
emailno NUMERIC,
question1 VARCHAR(80),
question2 VARCHAR(80),
question3 VARCHAR(80),
question4 VARCHAR(80),
question5 VARCHAR(80),
question6 VARCHAR(80),
question7 VARCHAR(80),
question8 VARCHAR(80),
question9 VARCHAR(80),
question10 VARCHAR(80),
question11 VARCHAR(80),
question12 VARCHAR(80),
question13 VARCHAR(8000)
)

DECLARE @tmpTable2  TABLE
(
emailNumber NUMERIC
)

DECLARE @counter INT
DECLARE @Email INT

SELECT @counter =COUNT(DISTINCT ans.email) FROM answers ans WHERE ans.surveyname=100430 AND ans.qnpkey BETWEEN 233702 AND 233714
SELECT * INTO #tmp FROM @tmpTable
INSERT INTO @tmpTable2 (emailNumber) SELECT DISTINCT CAST(ans.email AS NUMERIC) FROM answers ans WHERE ans.surveyname=100430 AND ans.qnpkey BETWEEN 233702 AND 233714

WHILE @counter >0

BEGIN

        SELECT TOP 1 @Email= emailNumber FROM @tmpTable2
        INSERT INTO @tmpTable (emailno) VALUES (@Email )


        Update @tmpTable set question1=CAST(answer as VARCHAR(80)) from answers ans where ans.surveyname=100430 and ans.qnpkey = 233702 and ans.email=@Email
        Update @tmpTable set question2=CAST(answer as VARCHAR(80)) from answers ans where ans.surveyname=100430 and ans.qnpkey = 233703 and email=@email
        Update @tmpTable set question3=CAST(answer as VARCHAR(80)) from answers ans where ans.surveyname=100430 and ans.qnpkey = 233704 and email=@email
        Update @tmpTable set question4=CAST(answer as VARCHAR(80)) from answers ans where ans.surveyname=100430 and ans.qnpkey = 233705 and email=@email
        Update @tmpTable set question5=CAST(answer as VARCHAR(80)) from answers ans where ans.surveyname=100430 and ans.qnpkey = 233706 and email=@email
        Update @tmpTable set question6=CAST(answer as VARCHAR(80)) from answers ans where ans.surveyname=100430 and ans.qnpkey = 233707 and email=@email
        Update @tmpTable set question7=CAST(answer as VARCHAR(80)) from answers ans where ans.surveyname=100430 and ans.qnpkey = 233708 and email=@email
        Update @tmpTable set question8=CAST(answer as VARCHAR(80)) from answers ans where ans.surveyname=100430 and ans.qnpkey = 233709 and email=@email
        Update @tmpTable set question9=CAST(answer as VARCHAR(80)) from answers ans where ans.surveyname=100430 and ans.qnpkey = 233710 and email=@email
        Update @tmpTable set question10=CAST(answer as VARCHAR(80)) from answers ans where ans.surveyname=100430 and ans.qnpkey = 233711 and email=@email
        Update @tmpTable set question11=CAST(answer as VARCHAR(80)) from answers ans where ans.surveyname=100430 and ans.qnpkey = 233712 and email=@email
        Update @tmpTable set question12=CAST(answer as VARCHAR(80)) from answers ans where ans.surveyname=100430 and ans.qnpkey = 233713 and email=@email
        Update @tmpTable set question13=CAST(answer as VARCHAR(8000)) from answers ans where ans.surveyname=100430 and ans.qnpkey = 233714 and email=@email

        insert into #tmp select * from  @tmpTable       

        DELETE FROM @tmpTable       
        DELETE FROM @tmpTable2 WHERE emailNumber= @Email

        set @counter =@counter -1

End

select * from #tmp
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top