Home
Manage Your Code
Snippet: Creating Pivot table in ADO.NET (C#)
Title: Creating Pivot table in ADO.NET Language: C#
Description: http://weblogs.sqlteam.com/jeffs/articles/5091.aspx Views: 1661
Author: John Yu Date Added: 12/28/2007
Copy Code  
1    public static DataTable Pivot(DataTable dataValues, string keyColumn, string pivotNameColumn, string pivotValueColumn)
2    {
3      DataTable tmp = new DataTable();
4      DataRow r;
5      string LastKey = "//dummy//";
6      int i, pValIndex, pNameIndex;
7      string s;
8      bool FirstRow = true;
9
10      pValIndex = dataValues.Columns[pivotValueColumn].Ordinal;
11      pNameIndex = dataValues.Columns[pivotNameColumn].Ordinal;
12
13      for (i = 0; i <= dataValues.Columns.Count - 1; i++)
14      {
15        if (i != pValIndex && i != pNameIndex)
16          tmp.Columns.Add(dataValues.Columns[i].ColumnName, dataValues.Columns[i].DataType);
17      }
18
19      r = tmp.NewRow();
20
21      foreach (DataRow row1 in dataValues.Rows)
22      {
23        if (row1[keyColumn].ToString() != LastKey)
24        {
25          if (!FirstRow)
26            tmp.Rows.Add(r);
27
28          r = tmp.NewRow();
29          FirstRow = false;
30
31          //loop thru fields of row1 and populate tmp table
32          for (i = 0; i <= row1.ItemArray.Length - 3; i++)
33            r[i] = row1[tmp.Columns[i].ToString()];
34
35          LastKey = row1[keyColumn].ToString();
36        }
37
38        s = row1[pNameIndex].ToString();
39
40        if (!tmp.Columns.Contains(s))
41          tmp.Columns.Add(s, dataValues.Columns[pNameIndex].DataType); 
42        r[s] = row1[pValIndex];
43      }
44
45      //add that final row to the datatable:
46      tmp.Rows.Add(r);
47
48      return tmp;
49    }
50  }
Usage
e.g.
(Key)	(PivotName)	(PivotValue)
Week	Equipment	Hours
1	D1		2.0
1	D2		1.0
2	D1		1.5
2	D2		0

>>>

Week	D1	D2
1	2.0	1.0
2	1.5	0