Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

डेटाग्रिडव्यू के लिए टेबल पिवट शैली को समतल करें

आप जो कर रहे हैं उसके आधार पर, कुछ मामलों में आप ऐसा करने के लिए एक प्रश्न या तैयार कथन बना सकते हैं। ये आमतौर पर ज्ञात स्तंभों के एक निश्चित सेट को संक्षेप में प्रस्तुत करने के लिए होते हैं। इस मामले में हम नहीं जानते कि कितने दिनांक स्तंभ होंगे या वे क्या हैं। तो, हम इसे कोड में कर सकते हैं।

मैंने MySQL के बजाय एक्सेस का उपयोग किया, लेकिन अवधारणा वही है। मैंने कक्षा के अनुसार उपस्थिति दर्ज करके इसे और भी जटिल बना दिया है जो प्रतिदिन नहीं मिलते हैं। प्रारंभिक डेटा:

मैं परिणामों में कक्षा के नाम का उपयोग नहीं करूंगा, यह प्रदर्शन को बहुत व्यापक बनाता है।

Dim sql = <sql>  
           ((Use your own SQL obviously))
           </sql>.Value

Dim dtTemp As New DataTable

' get the data
Using dbcon As OleDbConnection = GetACEConnection(),
    cmd As New OleDbCommand(sql, dbcon)

    dbcon.Open()
    Using da As New OleDbDataAdapter(cmd)
        da.Fill(dtTemp)
    End Using

End Using

' unique list of "date" columns in the result set
' ORDERBY Date is in the SQL
Dim colNames = dtTemp.AsEnumerable().
                Select(Function(s) DateTime.Parse(s.Item("Date").ToString).
                        ToString("MM/dd/yyyy")).
                Distinct.ToList()

' unique list of students
Dim Students = dtTemp.AsEnumerable().Select(Function(q) q.Item("Name")).
                Distinct.ToList()

' the final table to use with the DGV
Dim dt As New DataTable
Dim colName As String

' add the name and class code designation columns
dt.Columns.Add(New DataColumn(dtTemp.Columns(0).ColumnName, GetType(String)))
dt.Columns.Add(New DataColumn(dtTemp.Columns(1).ColumnName, GetType(String)))

' add a "MM/dd/yyyy" text column for each possible class day
For n As Int32 = 0 To colNames.ToArray.Count - 1
    colName = DateTime.Parse(colNames(n).ToString).ToString("MM/dd/yyyy")
    dt.Columns.Add(New DataColumn(colName, GetType(String)))
Next

Dim newRow As DataRow

' loop thru all students
For Each s In Students
    ' the student-class dataset
    Dim drs As DataRow() = dtTemp.Select(String.Format("Name = '{0}'", s.ToString)).
                            OrderBy(Function(o) o.Item("ClassCode")).ToArray

    ' create list of classes for this student
    Dim classes = drs.AsEnumerable.
            Select(Function(q) q.Item(1).ToString).Distinct.ToArray

    For Each classcode As String In classes
        ' filter the drs results to the current class
        Dim datestat As DataRow() = drs.AsEnumerable.
                Where(Function(q) q.Item(1).ToString = classcode).ToArray

        ' create new row, copy the data from drs.Rows to dt.columns
        newRow = dt.NewRow
        newRow.Item(0) = s
        newRow.Item(1) = classcode
        ' NOTE since not all students will have a class everyday, some
        ' "status" cells will be dbNull!
        For Each statRow In datestat
            Dim cname As String = DateTime.Parse(statRow.Item("Date").
                                                     ToString()).ToString("MM/dd/yyyy")
            newRow.Item(cname) = statRow.Item("Status")
        Next
        dt.Rows.Add(newRow)
    Next

Next

dgv.AutoGenerateColumns = True
dgv.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.ColumnHeader)
dgv.DataSource = dt

यह उतना जटिल नहीं है जितना यह लग सकता है।

  1. मास्टर डेटासेट पर काम करें
  2. अद्वितीय छात्र नामों की सूची प्राप्त करें
  3. डेटा तालिका में अद्वितीय वर्ग तिथियों को निकालने के लिए उपयोग किए जाने वाले कॉलम नाम एक linq क्वेरी से आते हैं
  4. एक नया DataTable बनाएं परिणामों के लिए।
    • StudentName के बाद और ClassCode लूप प्रत्येक दिनांक के लिए एक कॉलम जोड़ता है जो कोई भी . है वर्ग मिलता है। कॉलम नाम/हेडर टेक्स्ट ColNames . से आता है सूची/सरणी अभी बनाई गई है।

गंतव्य डेटाटेबल बनाने के साथ, आप इसमें डेटा की प्रतिलिपि बनाना शुरू कर सकते हैं। फिर से, OleDB... . के बजाय जिन वस्तुओं का आप उपयोग करेंगे MySQL... ऑब्जेक्ट, लेकिन वे वही काम करते हैं।

  1. छात्र सूची में सभी छात्रों के माध्यम से लूप करें
  2. प्रत्येक के लिए, मास्टर डेटा सेट से उन सभी कक्षाओं की सूची निकालें जिनमें उन्होंने भाग लिया
  3. उन वर्गों के माध्यम से लूप करें
  4. विद्यार्थी-कक्षा डेटासेट से वर्तमान कक्षा के लिए पंक्तियां निकालें
  5. एक नया DataRowबनाएं पहले 2 कॉलम के लिए छात्र और कक्षा पुनरावृत्ति संस्करण का उपयोग करना।
  6. वर्तमान छात्र-वर्ग डेटासेट में प्रत्येक दिनांक समय मान को परिणाम कॉलम (cname) बनाने के लिए उपयोग किए गए समान प्रारूप में कनवर्ट करें ).
    • उनकी स्थिति की प्रतिलिपि बनाने के लिए इसका उपयोग करें:newRow.Item(cname) = statRow.Item("Status") नई पंक्ति में
    • चूंकि कक्षाएं प्रतिदिन नहीं मिलती हैं, इसलिए कुछ कक्ष खाली रहेंगे (DbNull )
  7. नई पंक्ति को अंतिम डेटाटेबल में जोड़ें

कक्षा द्वारा रिपोर्टिंग के बिना यह आसान होगा, और पूरे दिन की स्थिति की रिपोर्ट करें। परिणाम:

सबसे भ्रमित करने वाला हिस्सा दिनांक डेटा . का उपयोग कर रहा है एक डेटाटेबल में एक कॉलम के रूप में नाम दूसरे में और समय भाग को अलग करना।

यह सिर्फ एक पहला पास है, इसलिए इसे परिष्कृत किया जा सकता है। कुछ प्रसंस्करण एसक्यूएल में किया जा सकता है; DateTime.Parse DateTime . को कन्वर्ट करने की विधि एक ही प्रारूप में एक स्ट्रिंग के लिए डेटा (समय आदि को हटा दें) इसकी अपनी प्रक्रिया हो सकती है। हेडर को थोड़ा संकरा बनाने के लिए मैं 2 कैरेक्टर ईयर फॉर्मेट का भी इस्तेमाल करूंगा।




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. प्रत्येक गैर-डिफ़ॉल्ट फ़ील्ड निर्दिष्ट किए बिना MySQL INSERT (#1067 - 'तालिका' के लिए अमान्य डिफ़ॉल्ट मान)

  2. PHP MySQL PDO lastInsertID घातक त्रुटि का कारण बनता है

  3. दूसरी चयन क्वेरी यदि पहले चयन 0 पंक्तियाँ लौटाता है

  4. रेक डीबी का उपयोग कर रेल में टेबल बनाने के साथ प्राथमिक प्रमुख मुद्दा:माइस्क्ल के साथ माइग्रेट कमांड

  5. MySQL-क्लस्टर प्रारंभ करने में विफल रहता है