نقل مجموعة من الصفوف كما الأعمدة في SQL Server 2000

StackOverflow https://stackoverflow.com/questions/152770

  •  02-07-2019
  •  | 
  •  

سؤال

هل هناك أي مرفق من نقل صفوف الأعمدة في 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

أنا ذاهب إلى وصف الأسلوب الذي يعمل.لقد استعملت.أنا لا الترويج لها ، لكنه يعمل.

إلى محور البيانات حيث كنت لا تعرف ما القيم التي يمكن أن تكون في وقت مبكر ، إنشاء الجدول المؤقت على الطاير بدون أعمدة.ثم استخدام المؤشر إلى حلقة خلال الصفوف ، إصدار حيوي بنيت "تغيير الجدول" لكل متغير, بحيث في النهاية temp جدول يحتوي على الأعمدة ، اللون ، الحجم ، المدينة.

ثم يمكنك إدراج صف واحد في الجدول المؤقت ، تحديثه عن طريق آخر المؤشر من خلال متغير قيمة أزواج ، ثم حدد عادة انضم مع الأم كيان في الواقع مما يجعلها تبدو مثل تلك المخصصة متغير/أزواج قيمة مثل الأعمدة المضمنة في الأصل الأصلية الكيان.

نصائح أخرى

المؤشر الطريقة الموضحة على الأرجح أقل SQL ترغب في استخدام.كما ذكر, SQL 2005 و على المحور الذي يعمل كبيرة.ولكن الإصدارات القديمة وغير MS SQL servers ، Rozenshtein الأسلوب من "Optimzing Transact-SQL" (تحرير:من الطباعة ، ولكن جدوى.من أمازون: http://www.amazon.com/Optimizing-Transact-SQL-Advanced-Programming-Techniques/dp/0964981203), ممتاز التمحور و unpivoting البيانات.ويستخدم نقطة الخصائص لتحويل الصف على أساس البيانات في الأعمدة.Rozenshtein يصف العديد من الحالات ، وهنا مثال واحد:

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

هذا الأسلوب هو أكثر كفاءة من استخدام بيانات حالة و يعمل على مجموعة متنوعة من أنواع البيانات و SQL تطبيقات (وليس فقط MS SQL).

أفضل للحد الصغيرة لهذا النوع من الشيء.إذا كنت تستخدم SQL 2k على الرغم من ذلك لا يكون محور الميزات المتوفرة ، لقد وضعت المخزنة proc التي ينبغي القيام بهذه المهمة بالنسبة لك.قليلا من قرح الاندفاع وظيفة حتى تسحبه بعيدا بقدر ما تريد.لصق التالية في 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'

بالنسبة UNPIVOT في sql server 2005 ، لقد وجدت مقالة جيدة

الأعمدة إلى صفوف في sql 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