McBooCzech wrote: > Hallo all, > > I am trying to generate SQL SELECT command which will return pivot > table. The number of column in the pivot table depends on the data > stored in the database. It means I do not know in advance how many > columns the pivot table will have. > > For example I will test the database as following: > SELECT DISTINCT T1.YEAR FROM T1 > > The SELECT command will return: > 2002 > 2003 > 2004 > 2005 > > So I would like to construct following select: > > select T1.WEEK, > SUM (case T1.YEAR when '2002' then T1.PRICE else 0 END) Y_02, > SUM (case T1.YEAR when '2003' then T1.PRICE else 0 END) Y_03, > SUM (case T1.YEAR when '2004' then T1.PRICE else 0 END) Y_04, > SUM (case T1.YEAR when '2005' then T1.PRICE else 0 END) Y_05 > from T1 > group by T1.week > > which will return pivot table with 5 columns: > WEEK, Y_02, Y_03, Y_04, Y_05, > > but if the command "SELECT DISTINCT T1.YEAR FROM T1" returns: > 2003 > 2004 > > I have to construct only following string: > > select T1.WEEK, > SUM (case T1.YEAR when '2003' then T1.PRICE else 0 END) Y_03, > SUM (case T1.YEAR when '2004' then T1.PRICE else 0 END) Y_04, > from T1 > group by T1.week > > which will return pivot table with 3 columns: > WEEK, Y_03, Y_04 > > Can anyone help and give me a hand or just direct me, how to write a > code which will generate SELECT string depending on the data stored in > the database as I described? > > Thanks > > Petr McBooCzech
In MS-Access, the appropriate SQL statement is TRANSFORM Sum(T1.price) AS SumOfprice SELECT T1.week FROM T1 GROUP BY T1.week PIVOT T1.year; Note the keywords TRANSFORM and PIVOT. These change an ordinary SELECT query into what Access calls a CROSSTAB query. In such a query, the number of columns is created automatically (subject to the limitation of a maximum of 256 columns). For example, if your T1 table contains: year week price 2002 1 123 2002 10 456 2002 20 254 2002 30 253 2002 40 325 2002 50 111 2003 1 254 2003 10 256 2003 20 854 2003 30 125 2003 40 845 2003 50 562 2004 1 425 2004 10 123 2004 20 212 2004 30 555 2004 40 412 2004 50 852 The query shown will output: week 2002 2003 2004 1 123 254 425 10 456 256 123 20 254 854 212 30 253 125 555 40 325 845 412 50 111 562 852 Now, if you add another year's worth of data, year week price 2005 1 666 2005 10 555 2005 20 444 2005 30 333 2005 40 222 2005 50 111 the query (without any modiification) will now output week 2002 2003 2004 2005 1 123 254 425 666 10 456 256 123 555 20 254 854 212 444 30 253 125 555 333 40 325 845 412 222 50 111 562 852 111 If you had multiple records for each year/week you would, of course, see the aggregate result (in this case, Sum). Watch what happens when I duplicate the 2005 records: week 2002 2003 2004 2005 1 123 254 425 1332 10 456 256 123 1110 20 254 854 212 888 30 253 125 555 666 40 325 845 412 444 50 111 562 852 222 -- http://mail.python.org/mailman/listinfo/python-list