Frage

Gibt es eine Möglichkeit der Zeilen-Spalten in SQL Server zur Umsetzung (es ist möglich, in MS-Access)? Ich war verwirrt, weil diese Anlage in MS-Access verfügbar ist, aber nicht in SQL Server. Ist es durch Design, das diese Funktion ist in SQL Server nicht berücksichtigt?

War es hilfreich?

Lösung

Das Beispiel unter http://jdixon.dotnetdevelopersjournal.com/pivot_table_data_in_sql_server_2000_and_2005.htm nur funktioniert, wenn Sie im Voraus, was die Zeilenwerte kennen sein kann. Zum Beispiel, sagen wir mal Sie eine Entität mit benutzerdefinierten Attributen und die benutzerdefinierte Attribute als Zeilen in einer untergeordneten Tabelle implementiert, wobei die untergeordnete Tabelle grundsätzlich Variable / Wert-Paare ist, und diese Variable / Wert-Paare konfigurierbar sind.

color red
size  big
city  Chicago

Ich werde eine Technik beschreiben, die funktioniert. Ich habe es benutzt. Ich bin die Förderung es nicht, aber es funktioniert.

Um die Daten zu schwenken, in dem Sie nicht wissen, was die Werte im voraus sein können, eine temporäre Tabelle on the fly ohne Spalten erstellen. Dann mit einem Cursor durch Ihre Zeilen Schleife, ein für jede Variable „alten table“ dynamisch erstellte Ausgabe, so dass am Ende Ihrer temporäre Tabelle die Spalten, Farbe, Größe, Stadt hat.

Sie dann eine Zeile in Ihrem temporären Tabelle einfügen, aktualisieren Sie es über einen anderen Cursor durch die Variable, Wert-Paare, und dann wählen, in der Regel mit ihrer Muttergesellschaft in der Tat verbunden macht es wie die benutzerdefinierten Variablen / Wert-Paare scheinen waren wie Einbau-Spalten in dem ursprünglichen Mutterunternehmen.

Andere Tipps

Der Cursor beschriebene Verfahren ist wahrscheinlich die am wenigsten SQL-ähnliche zu verwenden. Wie bereits erwähnt, SQL 2005 und hat PIVOT die großen Werke. Aber für ältere Versionen und Nicht-MS SQL Server, die Rozenshtein Methode von "Optimzing Transact-SQL" (edit: vergriffen, aber Gebrauch machen von Amazon. http://www.amazon.com/Optimizing-Transact-SQL-Advanced-Programming-Techniques/dp/0964981203 ) und eignet sich hervorragend für Schwenk unpivoting Daten. Es verwendet Punkt Merkmal Reihe basierte Daten in Spalten zu drehen. Rozenshtein beschreibt mehrere Fälle, hier ist ein Beispiel:

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

Diese Methode ist viel effizienter als Fall-Anweisungen und arbeitet für eine Vielzahl von Datentypen und SQL-Implementierungen (nicht nur MS SQL).

Am besten für diese Art der Sache zu kleinem Maßstab zu begrenzen. Wenn Sie SQL 2k verwenden obwohl und nicht -Drehfunktion zur Verfügung haben, habe ich eine gespeicherte Prozedur erstellt, die die Arbeit für Sie tun sollten. Bit eines botch Eilauftrag es so auseinanderziehen, so viel wie Sie möchten. Einfügen der unten in ein SQL-Fenster, und bearbeiten die EXEC am Boden als bevorzugt. Wenn Sie sehen wollen, was generiert werden wird, entfernen Sie die IHN in der Mitte:

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'

Für UNPIVOT in SQL Server 2005, ich habe einen guten Artikel gefunden

Spalten-zu-Zeilen-in-sQL-Server

Ich habe Daten in folgendem Format

Survey_question_ID

E-Mail (Benutzer )

Antwort

1 Umfrage gibt es 13 Fragen und Antworten die gewünschte Ausgabe i war

wollte

Benutzer --- Survey_question_ID1 --- Survey_question_ID2

E-Mail --- Antworten --- Antwort ........ so weiter

Hier ist die Lösung für SQL Server 2000 , Ursache Felddatentyp ist TEXT .

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top