2016-06-18 12 views
0

私はこのようなテーブルを持って、それがダイナミッククロステーブルVB.NET&SQLサーバー&LINQの

MAName fieldtext1 fieldtext2 fieldtext3 fieldtext4 fieldtext5 FehlerJeMA 
    karl 2   2   3   1   1    9 
    susi 1   0   0   1   0    2 
    john 0   1   0   0   2    3 

fieldtextnするfieldtext1から行くことができfieldtext列です、クエリに応じて。

私は解決策をここに見ていると分かったので、私のアプローチ:

Dim dt2 As New DataTable 
Dim nn As Integer = 0 
Dim Zeile As DataRow 

dt2.Columns.Add("MAName") 
' fieldtext distinct 
Dim query2 = (From dr In (From d In newTable2.AsEnumerable Select New With {.feldtext1 = d("feldtext")}) Select dr.feldtext1 Distinct) 

For Each Feldtext In query2 
    dt2.Columns.Add(Feldtext)    
Next 

column = New DataColumn() 
column.DataType = System.Type.GetType("System.Int32") 
column.ColumnName = "FehlerJeMA" 
dt2.Columns.Add(column) 

' MAName distinct 
Dim query3 = (From dr In (From d In newTable2.AsEnumerable Select New With {.MAName2 = d("MAName")}) Select dr.MAName2.ToString.ToLower Distinct) 

For Each Mitarbeiter In query3 
    Zeile = dt2.NewRow() 
    Zeile(0) = Mitarbeiter.ToString.ToLower 
    MA2 = Mitarbeiter.ToString.ToLower 

    nn = 1 

    For Each colName2 In query2 

     Fehler2 = colName2 
     Dim AnzahlFehler As String = (From row In newTable2.Rows Select row Where row("MAName").ToString.ToLower = MA2 And row("feldtext") = Fehler2).Count 
     If AnzahlFehler = 0 Then 
      AnzahlFehler = "" 
     End If 
     Zeile(nn) = AnzahlFehler 

     nn += 1 

     If AnzahlFehler <> "" Then 
      FehlerJeMA += CInt(AnzahlFehler) 
     End If 
    Next 

    Zeile(nn) = FehlerJeMA 

    dt2.Rows.Add(Zeile) 
Next 

これは動作しますが、非常に遅いですが...

私のテーブルでより多くを持っている場合可能性があり10.000行...

私の質問は:結果を得るための最速のアプローチは何ですか?

linqで何らかのクロステーブルですか?他のアプローチ?

あなたの問題のためにそれを翻訳しようとすると、コードを使用することができますC#ので
+0

SQL Serverのどのバージョンを使用していますか? – Alex

+0

MSSQL Server 2014 – frank123

+1

テーブルに多数の行がある場合は、SQL Serverソリューションを使用することをお勧めします。 Googleでは「SQL Serverの動的ピボット」を使用できます。だからすでにいくつかの答えがあります:http://stackoverflow.com/questions/25443598/sql-server-dynamic-pivot and http://stackoverflow.com/questions/10404348/sql-server-dynamic-pivot-query – Alex

答えて

0

var pivotData = data.GroupBy(x => new {x.MAName, x.feldtext}, (key, group) => new { MAName = key.Column1, feldtext = key.Column2, count = group.Count() }); 
+0

私は私はC#に精通していないので、私はhttp://codeconverter.sharpdevelop.netからコンバータを使用し、http://converter.telerik.com/からコンバータを教えてください:Dim pivotData = data.GroupBy(Function(x)New From {_ \t x.MAName、_ \t x.feldtext _ }、関数(キー群)newで{_ \tキー.MAName = key.Column1、_ \tキー.feldtext = key.Column2、_ \t Key .count = group.Count()_ })しかし、私はVBでコードを貼り付けてしまいますNEW FROM。なぜか教えてくれますか? – frank123

+0

@ frank123私はアルゴリズムが似ていることはできません: グループによってグループ化し、次にfeldtextによって、グループのキーとカウント要素を取得します。それで全部です :) – W92