Ireport

Preciso fazer um relatório e preciso que o número de colunas dele não seja fixo, mas que possa variar, por exemplo, quando o relatório for feito para quatro meses possua quatro colunas, quando for feito para seis meses possua seis colunas.
A variação não pode acontecer apenas no número de linhas, mas também no de colunas.
Agradeço qualquer ajuda, obrigado

onde voce quer fazer esse relatorio? em um frame ou relatorios externos com iReport?

se for em frames tenta fazer da seguinte maneira


import java.util.*;
import java.awt.*;
import javax.swing.*;
import java.sql.*;


public class Grid extends JFrame
{
  private static final long serialVersionUID = 1L;
  Connection con;
  JTable table;

  public Grid()
  {
    try
    { 
        Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
        con=DriverManager.getConnection("jdbc:odbc:AGE");
    }
    catch(Exception ex)
    {
        System.out.println("erro na abertura do banco");
    }
    getTable();
  }

private void getTable()
  { 
      Statement st;
      ResultSet rs;
      try
      { 
        st = con.createStatement(); //criando uma conexão com Statement
        rs = st.executeQuery("Select * from agenda");
        Vector cols = new Vector();
        Vector lins = new Vector();
        ResultSetMetaData rsmd = rs.getMetaData();

        for (int i=1;i<=rsmd.getColumnCount();i++)
          cols.addElement( rsmd.getColumnName(i) );

        while (rs.next())
          lins.addElement( getLinha(rs,rsmd) );
        
        table = new JTable(lins,cols);
        JScrollPane sp = new JScrollPane(table);
        
        this.getContentPane().add(sp,BorderLayout.CENTER);
        validate();             // utilizado junto com o Layout 
        st.close();
      }
      catch (Exception ex)
      {
      }
    }

    private Vector getLinha(ResultSet rs, ResultSetMetaData rsmd)
    {
      Vector vect = new Vector();
      try
       {
         for (int i=1; i<=rsmd.getColumnCount(); i++)
            switch (rsmd.getColumnType(i))
            { case Types.VARCHAR: vect.addElement(rs.getString(i));
                                  break;
              case Types.INTEGER: vect.addElement(new Long(rs.getLong(i)));
                                  break;
            }
       }
      catch (Exception ex) {}
      return vect;
    } 
}

Apenas mude seu SELECT que ja funciona, pois ele tras o numero de linhas e numero de colunas de sua consulta, monta sua tabela com esses valores, nunca com valores fixos.