title: How can I use an SQL Pivot for this?
body: <p>I have a data set that is organized in the following manner:</p>
  
  <pre><code>Timestamp|A0001|A0002|A0003|A0004|B0001|B0002|B0003|B0004 ...
  ---------+-----+-----+-----+-----+-----+-----+-----+-----
  2008-1-1 |  1  |  2  | 10  |   6 |  20 |  35 | 300 |  8
  2008-1-2 |  5  |  2  |  9  |   3 |  50 |  38 | 290 |  2    
  2008-1-4 |  7  |  7  | 11  |   0 |  30 |  87 | 350 |  0
  2008-1-5 |  1  |  9  |  1  |   0 |  25 | 100 |  10 |  0
  ...
  </code></pre>
  
  <p>Where A0001 is Value A of item #1 and B0001 is Value B of item #1.  There can be over 60 different items in a table, and each item has an A value column and a B value column, meaning a total of over 120 columns in the table.</p>
  
  <p>Where I want to get to is a 3 column result (Item index, A Value, B Value) that sums the A and B values for each item:</p>
  
  <pre><code>Index | A Value | B Value
  ------+---------+--------
   0001 |   14    |   125
   0002 |   20    |   260
   0003 |   31    |   950
   0004 |    9    |    10
   .... 
  </code></pre>
  
  <p>As I am going from columns to rows I would expect a pivot in the solution, but I am not sure of how to flesh it out.  Part of the issue is how to strip out the A's and B's to form the values for the Index column.  The other part is that I have never had to use a Pivot before, so I am stumbling over the basic syntax as well.</p>
  
  <p>I think that ultimately I need to have a multi step solution that first builds the summations as:</p>
  
  <pre><code>ColName | Value
  --------+------
  A0001   |  14
  A0002   |  20
  A0003   |  31
  A0004   |   9
  B0001   | 125
  B0002   | 260
  B0003   | 950
  B0004   |  10
  </code></pre>
  
  <p>Then modify the ColName data to strip out the index:</p>
  
  <pre><code>ColName | Value | Index | Aspect
  --------+-------+-------+-------
  A0001   |  14   | 0001  |  A
  A0002   |  20   | 0002  |  A
  A0003   |  31   | 0003  |  A
  A0004   |   9   | 0004  |  A
  B0001   | 125   | 0001  |  B
  B0002   | 260   | 0002  |  B
  B0003   | 950   | 0003  |  B
  B0004   |  10   | 0004  |  B
  </code></pre>
  
  <p>Finally self join to move the B values up next to the A Values.</p>
  
  <p>This seems to be a long winded process to get what I want.  So I am after advice as to whether I am headed down the right path, or is there another approach that I have over looked that will make my life so much easier.</p>
  
  <p>Note 1) The solution has to be in T-SQL on MSSQL 2005.</p>
  
  <p>Note 2) The format of the table cannot be changed.</p>
  
  <p><strong>Edit</strong> Another method I have thought about uses UNIONs and individual SUM()s on each column:</p>
  
  <pre><code>SELECT '0001' as Index, SUM(A0001) as A, SUM(B0001) as B FROM TABLE
  UNION
  SELECT '0002' as Index, SUM(A0002) as A, SUM(B0002) as B FROM TABLE
  UNION
  SELECT '0003' as Index, SUM(A0003) as A, SUM(B0003) as B FROM TABLE
  UNION
  SELECT '0004' as Index, SUM(A0004) as A, SUM(B0004) as B FROM TABLE
  UNION
  ...
  </code></pre>
  
  <p>But this approach really doesn't look very nice either</p>
  
  <p><strong>EDIT</strong>  So far there are 2 great responses.  But I would like to add two more conditions  to the query :-)  </p>
  
  <p>1) I need to select the rows based on a range of timestamps (minv &lt; timestamp &lt; maxv). </p>
  
  <p>2) I also need to conditionally select rows on a UDF that processes the timestamp</p>
  
  <p>Using Brettski's table names, would the above translate to:</p>
  
  <pre><code>...
  (SELECT A0001, A0002, A0003, B0001, B0002, B0003 
   FROM ptest 
   WHERE timestamp&gt;minv AND timestamp&lt;maxv AND fn(timestamp)=fnv) p
  unpivot
  (val for item in (A0001, A0002, A0003, B0001, B0002, B0003)) as unpvt
  ...
  </code></pre>
  
  <p>Given that I have conditionally add the fn() requirement, I think that I also need to go down the dynamic SQL path as proposed by Jonathon.  Especially as I have to build the same  query for 12 different tables - all of the same style.</p>