Frage

Ich habe ein sehr einfaches problem, das erfordert eine sehr schnelle und einfache Lösung in SQL Server 2005.

Ich habe eine Tabelle mit x Spalten.Ich möchte in der Lage sein, zu wählen Sie eine Zeile aus der Tabelle und wandeln sich dann die Spalten in Zeilen.

TableA
Column1, Column2, Column3

SQL-Anweisung mit Rückkehr

ResultA
Value of Column1
Value of Column2
Value of Column3

@Kevin: Ich habe eine google-Suche zu dem Thema, aber eine Menge von dem Beispiel, in dem zu Komplex für mein Beispiel sind Sie in der Lage weiter zu helfen?

@Mario:Die Lösung, die ich erschaffe, hat 10 Spalten, welche den Werten 0 bis 6, und ich muss ausrechnen, wie viele Spalten haben den Wert 3 oder mehr.Also dachte ich über das erstellen einer Abfrage zu drehen, die in Zeilen und dann mit der erstellten Tabelle in einer Unterabfrage zu sagen, zählen Sie die Anzahl der Zeilen mit der Spalte >= 3

War es hilfreich?

Lösung

Sie sollten einen Blick auf die UNPIVOT-Klausel.

Update1:GateKiller, seltsam genug Las ich einen Artikel (über etwas nicht) über, die es an diesem morgen, und ich versuche, mein Gedächtnis zu joggen, wo ich sah es wieder, hatte ein paar anständige suchen Beispiele zu.Es wird wieder zu mir kommen, bin ich mir sicher.

Update2:Gefunden: http://weblogs.sqlteam.com/jeffs/archive/2008/04/23/unpivot.aspx

Andere Tipps

Ich musste das tun, für ein Projekt vor.Eine der großen Schwierigkeiten, die ich hatte, war, zu erklären, was ich versuche zu tun, zu anderen Menschen.Ich verbrachte eine Menge Zeit zu tun versuchen, diese in SQL, aber ich fand die pivot-Funktion völlig unzureichend.Ich erinnere mich nicht den genauen Grund, warum es war, aber es ist zu simpel für die meisten Anwendungen, und es ist nicht voll implementiert in MS SQL 2000.Ich aufgewickelt schreiben Sie eine pivot-Funktion .NET.Ich werde es hier posten, in der Hoffnung es hilft, jemand, eines Tages.

 ''' <summary>
    ''' Pivots a data table from rows to columns
    ''' </summary>
    ''' <param name="dtOriginal">The data table to be transformed</param>
    ''' <param name="strKeyColumn">The name of the column that identifies each row</param>
    ''' <param name="strNameColumn">The name of the column with the values to be transformed from rows to columns</param>
    ''' <param name="strValueColumn">The name of the column with the values to pivot into the new columns</param>
    ''' <returns>The transformed data table</returns>
    ''' <remarks></remarks>
    Public Shared Function PivotTable(ByVal dtOriginal As DataTable, ByVal strKeyColumn As String, ByVal strNameColumn As String, ByVal strValueColumn As String) As DataTable
        Dim dtReturn As DataTable
        Dim drReturn As DataRow
        Dim strLastKey As String = String.Empty
        Dim blnFirstRow As Boolean = True

        ' copy the original data table and remove the name and value columns
        dtReturn = dtOriginal.Clone
        dtReturn.Columns.Remove(strNameColumn)
        dtReturn.Columns.Remove(strValueColumn)

        ' create a new row for the new data table
        drReturn = dtReturn.NewRow

        ' Fill the new data table with data from the original table
        For Each drOriginal As DataRow In dtOriginal.Rows

            ' Determine if a new row needs to be started
            If drOriginal(strKeyColumn).ToString <> strLastKey Then

                ' If this is not the first row, the previous row needs to be added to the new data table
                If Not blnFirstRow Then
                    dtReturn.Rows.Add(drReturn)
                End If

                blnFirstRow = False
                drReturn = dtReturn.NewRow

                ' Add all non-pivot column values to the new row
                For Each dcOriginal As DataColumn In dtOriginal.Columns
                    If dcOriginal.ColumnName <> strNameColumn AndAlso dcOriginal.ColumnName <> strValueColumn Then
                        drReturn(dcOriginal.ColumnName.ToLower) = drOriginal(dcOriginal.ColumnName.ToLower)
                    End If
                Next
                strLastKey = drOriginal(strKeyColumn).ToString
            End If

            ' Add new columns if needed and then assign the pivot values to the proper column
            If Not dtReturn.Columns.Contains(drOriginal(strNameColumn).ToString) Then
                dtReturn.Columns.Add(drOriginal(strNameColumn).ToString, drOriginal(strValueColumn).GetType)
            End If
            drReturn(drOriginal(strNameColumn).ToString) = drOriginal(strValueColumn)
        Next

        ' Add the final row to the new data table
        dtReturn.Rows.Add(drReturn)

        ' Return the transformed data table
        Return dtReturn
    End Function

UNION sollte dein Freund sein:

SELECT Column1 FROM table WHERE idColumn = 1
UNION ALL
SELECT Column2 FROM table WHERE idColumn = 1
UNION ALL
SELECT Column3 FROM table WHERE idColumn = 1

aber es kann auch Ihr Feind auf großen Ergebnismengen.

Wenn Sie eine fixe Anzahl von Spalten, und Sie wissen, was Sie sind, können Sie im Grunde tun eine Reihe von subselects

(SELECT Column1 AS ResultA FROM TableA) as R1

und kommen die subselects.All dies in einer einzigen Abfrage.

Ich bin nicht sicher, dass der SQL Server-syntax, aber in MySQL würde ich tun

SELECT IDColumn, ( IF( Column1 >= 3, 1, 0 ) + IF( Column2 >= 3, 1, 0 ) + IF( Column3 >= 3, 1, 0 ) + ... [snip ] )
  AS NumberOfColumnsGreaterThanThree
FROM TableA;

EDIT:Ein sehr (sehr) kurze Google-Suche sagt mir, dass die CASE Anweisung tut, was ich Tue, mit dem IF - Anweisung in MySQL.Sie kann oder kann nicht erhalten, verwenden Sie aus die Google Ergebnis fand ich

WEITER BEARBEITEN:Ich sollte auch darauf hinweisen, dass dies nicht die Antwort auf deine Frage, aber eine alternative Lösung zu Ihrem eigentlichen problem.

SELECT IDColumn, 
       NumberOfColumnsGreaterThanThree = (CASE WHEN Column1 >= 3 THEN 1 ELSE 0 END) + 
                                         (CASE WHEN Column2 >= 3 THEN 1 ELSE 0 END) + 
                                         (Case WHEN Column3 >= 3 THEN 1 ELSE 0 END) 
FROM TableA;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top