locked
Criar um PIVOT dinâmico RRS feed

  • Pergunta

  • O cenário é o seguinte:

    Tenho 4 tabelas:

    Veiculos:

    Campo

    Tipo

    Placa

    Varchar(7) - Chave

    numCarro

    varchar(3)

    Vendido

    bit

    Alunos:

    Campo                

    Tipo

    idAluno                               

    int

    apelido               

    varchar(20)

    Turno:

    Campo

    Tipo

    idTurno

    int

    Turno

    Time

    QuadroHorario:

    Campo

    Tipo

    Data

    DateTime - Chave

    Carro

    varchar(3) - Chave

    ItensQuadroHorario:

    Campo

    Tipo

    Data

    DateTime

    Carro

    varchar(3)

    Hora

    Time


    Preciso realizar um PIVOT com essas tabelas e que me apresente os dados com o join abaixo:

    SELECT     IQHD.Hora,QHD.carro, A.apelido
    FROM         tblAlunos A INNER JOIN
                          tblItensQuadroHorarioDir IQHD ON A.idAluno = IQHD.idAluno INNER JOIN
                          tblQuadroHorarioDir QHD ON IQHD.Carro = QHD.carro INNER JOIN
                          tblVeiculos  V ON QHD.carro = V.numCarro INNER JOIN
                          tblTurnos T ON IQHD.Hora = T.descricao
    

    Esse script apresenta a tabela da seguinte forma:

    Hora

    Carro

    Apelido

    07:00

    004

    FLAVIA

    07:50

    009

    ARTUR

    07:50

    003

    VITORIA

    O objetivo do PIVOT nessa consulta é deixar o grid da seguinte forma:

    Hora

      003

    004

    009

    07:00

    FLAVIA

    07:50

    VITORIA

    ARTUR

    Sendo que preciso organizar os horários e os veículos como aparecem, de forma crescente.

    Alguém pode me orientar? Eu já fiz isso em ACCESS e DELPHI e estou tentando migrar o sistema para o

    C# mas o PIVOT do ACCESS não tem a menor semelhança com o que é usado no SQLServer.

    Marcello M. M.


    segunda-feira, 19 de maio de 2014 23:49

Respostas

Todas as Respostas

  • Deleted
    terça-feira, 20 de maio de 2014 00:45
  • FINO ZÉ!! Funfou legal. Agora só tratar para que as células que apresentam a palavra 'NULL' apresentarem um string vazio. Valeu mesmo irmão. 

    Braços. qqCoisa eu retorno...

    terça-feira, 20 de maio de 2014 17:59
  • Boa tarde Jose!

    Então, seguinte eu alterei parte do seu código para gerar a tabela PIVOT substituindo a parte da criação por uma view. Funcionou perfeitamente. Mas para apresentar o resultado no C# tô sofrendo pra caramba! Não estou conseguindo implementar o tratamento do SELECT para apresenta-lo. Sendo que estou usando programação em camadas. Eu tenho:

    OBJETO TRANSFERENCIA:

    namespace ObjetoTransferencia
    {
       public class QuadroHorarioPivot
        {
           public DateTime Data { get; set; }
           public string Carro { get; set; }
           public DateTime Hora { get; set; }
           public int idAluno { get; set; }
           public string apelido { get; set; }

    namespace ObjetoTransferencia
    {
       public class QuadroHorarioPivotColecao:List<QuadroHorarioPivot>
        {
        }
    }

    NEGÓCIOS:

                    

    public QuadroHorarioPivotColecao ConsultarQuadro(DateTime Data)
            {
                try
                {
                    //CRIA UMA NOVA COLECAO QUADRO HORARIO
                    QuadroHorarioPivotColecao quadroHorarioPivotColecao = new QuadroHorarioPivotColecao();

                    acessoDadosSqlServer.LimparParametros();
                    acessoDadosSqlServer.AdicionarParametros("@Data", Data);

                    //CRIA UMA DATATABLE
                    DataTable dataTableQuadroOrigem = acessoDadosSqlServer.ExecutarConsultar(CommandType.StoredProcedure, "uspQuadroHorarioDirConsultar");

                    foreach (DataRow linha in dataTableQuadroOrigem.Rows)
                    {
                        QuadroHorarioPivot quadroHorarioPivot = new QuadroHorarioPivot();

                        //quadroHorarioPivot.Data = Convert.ToDateTime(linha["Data"]);
                        quadroHorarioPivot.Carro = Convert.ToString(linha["Carro"]);
                        quadroHorarioPivot.Hora=Convert.ToDateTime(linha["Hora"]);
                        //quadroHorarioPivot.idAluno = Convert.ToInt32(linha["idAluno"]);
                        quadroHorarioPivot.apelido = Convert.ToString(linha["apelido"]);

                        quadroHorarioPivotColecao.Add(quadroHorarioPivot);

                    }



                    return quadroHorarioPivotColecao;
                }
                catch (Exception exception)
                {

                    throw new Exception("Não foi possível consultar quadro de horários. Detalhes : " + exception.Message);
                }

            }

    Sei que na clase Obeto Transferencia e tambem antes do 'foreach' eu tenho que tratar os dados retornados para substituir o campo   quadroHorarioPivot.Carro = Convert.ToString(linha["Carro"]); para me retornar o número de cada carro, mas não estou conseguindo. Pode ser uma nova ajuda ae?

    Vlw de novo brother.

     
    quinta-feira, 4 de dezembro de 2014 19:06