Feedback

C# - Pivot-Tabelle erstellen

Veröffentlicht von am 10/1/2008
(2 Bewertungen)
Eine Klasse die eine Pivot-Tabelle aus einem DataTable erstellt.

Somit kann eine Pivot-Tabelle zB in einem DataGridView ohne Fremdkomponenten angezeigt werden.

zB Quelltabelle:
Jahr | Quartal | Umsatz
j1 | q1 | u1
j2 | q2 | u2
... | ... | ...

daraus entsteht
Jahr | q1 | q2 | ...
j1 | s11| s12| ...
j2 | s21| s22| ...
... | ...| ...| ...

Aufruf für obiges Beispiel:
DataTable pivotTable = PivotTabelle.PivotTabelleErstellen(
quellDaten,
"Jahr",
"Quartal",
"Umsatz",
true);
dataGridView1.DataSource = pivotTabelle;
using System.Data;

namespace gfoidl.Daten.Pivot
{
	public static class PivotTabelle
	{
		/// <summary>
		/// Erstellt eine Pivot-Tabelle aus den Daten.
		/// Die Daten werden nicht aggregiert!
		/// </summary>
		/// <param name="quellTabelle">
		/// DataTable mit den Quelldaten
		/// </param>
		/// <param name="linkeSpalte">
		/// Spaltenbeschriftung für die linkste Spalte (Spaltenname in Quelldaten)
		/// </param>
		/// <param name="spaltenBeschriftung">
		/// Spaltenbeschriftung für die Datenzeilen (Spaltenname in Quelldaten)
		/// </param>
		/// <param name="werte">
		/// angezeigte Werte (Spaltenwerte in Quelldaten)
		/// </param>
		/// <param name="SUM">
		/// Gibt an ob die Daten aggregiert werden sollen. Wenn ja werden
		/// die Werte aufsummiert. Die Werte müssen in <c>float</c>
		/// konvertierbar sein.
		/// </param>
		/// <returns>
		/// Pivot-Tabelle
		/// </returns>
		public static DataTable PivotTabelleErstellen(
			DataTable quellTabelle,
			string linkeSpalte,
			string spaltenBeschriftung,
			string werte,
			bool SUM)
		{
			if (quellTabelle == null) return null;

			// DataTables die benötigt werden:
			DataTable pivotTabelle = new DataTable();
			DataTable dtZeilenBeschriftung = new DataTable();
			DataTable dtSpaltenHeader = new DataTable();

			// Tabelle für die Werte der linken Spalte:
			dtZeilenBeschriftung = quellTabelle.DefaultView.ToTable(
				true,
				quellTabelle.Columns[linkeSpalte].ColumnName);

			// Tabelle mit den Spaltenüberschriften für die Datenzeile:
			dtSpaltenHeader = quellTabelle.DefaultView.ToTable(
				true,
				quellTabelle.Columns[spaltenBeschriftung].ColumnName);

			// Linke Spalte zur Pivot-Tabelle hinzufügen:
			pivotTabelle.Columns.Add(
				new DataColumn
				{
					ColumnName = linkeSpalte,
					Caption = linkeSpalte
				});

			// Alle weiteren Spalten hinzufügen (Zeilenüberschriften):
			foreach (DataRow zeile in dtSpaltenHeader.Rows)
			{
				pivotTabelle.Columns.Add(
					new DataColumn
					{
						ColumnName = zeile[spaltenBeschriftung]
							.ToString()
							.Trim()
					});
			}

			// Zeilen mit den Werten der linken Spalte hinzufügen:
			foreach (DataRow zeile in dtZeilenBeschriftung.Rows)
			{
				DataRow dr = pivotTabelle.NewRow();
				dr[0] = zeile[linkeSpalte];
				pivotTabelle.Rows.Add(dr);
			}

			// Datenwerte schreiben.
			// Alle Zeilen der Quell-Tabelle durchlaufen und
			// die Werte in die entsprechenden Felder der
			// Pivot-Tabelle schreiben:
			foreach (DataRow quellZeile in quellTabelle.Rows)
			{
				string zeilenWert = quellZeile[linkeSpalte].ToString();
				string spaltenWert = quellZeile[spaltenBeschriftung].ToString();

				// Alle Zeilen der Ziel-Tabelle (Pivot-Tabelle) durchlaufen.
				// Wenn die richtige Zeile gefunden wurde -> Spalten:
				foreach (DataRow pivotZeile in pivotTabelle.Rows)
				{
					if (zeilenWert == pivotZeile[0].ToString())
					{
						// Zeile wurde gefunden -> alle Spalten durchlaufen
						// bis die richtige gefunden wurde:
						for (int i = 0; i < pivotZeile.Table.Columns.Count; i++)
						{
							if (pivotZeile.Table.Columns[i].ColumnName == spaltenWert)
							{
								// Index der Ziel-Zeile ermitteln und Wert
								// schreiben:
								int index = pivotTabelle.Rows.IndexOf(pivotZeile);

								// Aggregation?
								if (SUM)
									pivotTabelle.Rows[index][i] =
										(float)pivotTabelle.Rows[index][i] +
										(float)quellZeile[werte];
								else
									pivotTabelle.Rows[index][i] =
										quellZeile[werte];

								// Dieses Spalte ist erledigt -> Schleife kann
								// beendet werden:
								break;
							}
						}

						// Diese Zeile ist erledigt -> Schleife kann 
						// beendet werden:
						break;
					}
				}
			}

			// Sortieren nach der linken Spalte:
			pivotTabelle.DefaultView.Sort = pivotTabelle.Columns[0].ColumnName;

			// Pivot-Tabelle zurückgeben:
			return pivotTabelle;
		}
	}
}

Kommentare zum Snippet

 

Logge dich ein, um hier zu kommentieren!