2008-08-06 11 views
13

मेरे पास एक बहुत ही सरल समस्या है जिसके लिए SQL Server 2005 में बहुत तेज़ और सरल समाधान की आवश्यकता है।मैं एसक्यूएल कॉलम को पंक्तियों में कैसे बदलूं?

मेरे पास x कॉलम के साथ एक टेबल है। मैं तालिका से एक पंक्ति का चयन करने में सक्षम होना चाहता हूं और फिर स्तंभों को पंक्तियों में बदलना चाहता हूं।

TableA 
Column1, Column2, Column3 

एसक्यूएल वक्तव्य ruturn को

ResultA 
Value of Column1 
Value of Column2 
Value of Column3 

@Kevin: मैं विषय पर एक गूगल खोज लेकिन उदाहरण है जहाँ मेरे उदाहरण के लिए बहुत जटिल, हैं की बहुत मिला है आप आगे मदद करने में सक्षम हैं?

@ मारियो: मेरे द्वारा बनाए गए समाधान में 10 कॉलम हैं जो 0 से 6 मानों को संग्रहीत करते हैं और मुझे यह कार्य करना होगा कि कितने कॉलम मान 3 या अधिक हैं। तो मैंने पंक्तियों में बदलने के लिए एक क्वेरी बनाने के बारे में सोचा और फिर एक सबक्वायरी में उत्पन्न तालिका का उपयोग करने के लिए कॉलम> = 3

+0

देखो: http://sql-tricks.blogspot.com/2011/04/sql-server-rows-transpose.html – Dalex

+0

हम्म ... अब है कि कुछ मैंने है कभी कोशिश नहीं की। मेरे दिमाग में आने वाले समाधान सभी बहुत मुश्किल और बहुत बदसूरत हैं, और मुझे यकीन है कि कुछ और अधिक सुरुचिपूर्ण है। मैंने यूएनपीआईवीओटी पर भी एक खोज की है और ऐसा लगता है कि यह रास्ता आपको जाना चाहिए। मैं इसे अगले दिनों के दौरान हल करने के लिए एक पहेली के रूप में ले जाऊंगा। –

उत्तर

5

के साथ पंक्तियों की संख्या गिनने के लिए एक यूएनपीआईवीओटी क्लॉज पर एक नज़र डालना चाहिए।

Update1: GateKiller, अजीब पर्याप्त मैं एक लेख इसके बारे में (असंबंधित कुछ के बारे में) आज सुबह पढ़ सकते हैं और मैं अपने स्मृति जॉगिंग करने के लिए जहां मैं इसे फिर से देखा था, कुछ सभ्य देख उदाहरण भी था कोशिश कर रहा हूँ। यह मेरे पास वापस आ जाएगा मुझे यकीन है।

Update2: यह मिल गया: http://weblogs.sqlteam.com/jeffs/archive/2008/04/23/unpivot.aspx

0

UNION अपने दोस्त होना चाहिए:

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 

लेकिन यह बड़े परिणाम सेट पर also be your foe कर सकते हैं।

0

आप स्तंभों की एक निश्चित सेट है और आप जानते हैं कि वे क्या कर रहे हैं, तो आप मूल रूप से subselects

(SELECT Column1 AS ResultA FROM TableA) as R1

की एक श्रृंखला है और subselects शामिल हो सकते हैं। यह सब एक ही प्रश्न में है।

0

मैं इस के लिए एसक्यूएल सर्वर वाक्य रचना के बारे में सुनिश्चित नहीं कर रहा हूँ, लेकिन मैं MySQL में

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

संपादित करना होगा: एक बहुत (बहुत) को जानकारी गूगल खोज मुझसे कहता है CASE बयान मैं क्या कर रहा हूँ है कि MySQL में IF कथन के साथ। आप the Google result I found

और संपादित करें: मुझे यह भी इंगित करना चाहिए कि यह आपके प्रश्न का उत्तर नहीं है बल्कि आपकी वास्तविक समस्या का वैकल्पिक समाधान है।

1

मुझे इसे पहले एक परियोजना के लिए करना था। मेरी बड़ी मुश्किलों में से एक यह समझा रहा था कि मैं अन्य लोगों के साथ क्या करने की कोशिश कर रहा था। मैंने एसक्यूएल में ऐसा करने का प्रयास करने में एक टन बिताया, लेकिन मुझे पाइवेट फ़ंक्शन को अपर्याप्त रूप से अपर्याप्त पाया गया। मुझे यह सही कारण याद नहीं आया कि यह क्यों था, लेकिन अधिकांश अनुप्रयोगों के लिए यह बहुत सरल है, और यह एमएस एसक्यूएल 2000 में पूर्ण रूप से कार्यान्वित नहीं है। मैंने .NET में एक पिवट फ़ंक्शन लिखना घायल कर दिया। मैं इसे उम्मीद में यहां पोस्ट करूंगा कि यह किसी दिन किसी की मदद करता है।मेरे ब्लॉग पर

''' <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 
0
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; 
संबंधित मुद्दे