none
Pivot dinámico con campo texto

    Question

  • Mi inconveniente es que necesito hacer un Pivot dinámico (es decir, pasar las filas de una consulta a Títulos de consulta pero automáticamente), ya que el numero de columnas se desconoce, ademas el otro valor el de las filas, es texto, no es numero, y por lo tanto no puedo usar SUM o alguna función de agregado para agrupar los valores. La verdad soy principiante en esto del T-SQL y no he conseguido los resultados que espero obtener.

    El query que arroja los resultados normales sin pivotear es el siguiente:

    SELECT   distinct  Persona.Apellido_1 + ' ' + Persona.Apellido_2 + ' ' + Persona.Nombres AS Nomb, Semestre.Semestre, Asignatura.Nombre AS Asignatura, 
                          Matricula_Asignatura.Estado
    FROM         Semestre INNER JOIN
                          Distribucion INNER JOIN
                          Asignatura ON Distribucion.Cod_Asignatura = Asignatura.Cod_Asignatura ON Semestre.Cod_Semestre = Distribucion.Cod_Semestre INNER JOIN
                          Persona INNER JOIN
                          Alumno ON Persona.Id_Persona = Alumno.Id_Persona INNER JOIN
                          Matricula ON Alumno.Id_Alumno = Matricula.Id_Alumno INNER JOIN
                          Matricula_Asignatura ON Matricula.Cod_Matricula = Matricula_Asignatura.Cod_Matricula ON Semestre.Cod_Semestre = Matricula.Cod_Semestre
    WHERE     (Semestre.Cod_Carrera = 4) AND (Distribucion.Cod_Periodo = 24) AND (Semestre.Cod_Semestre = 27) and (Matricula.Cod_Periodo=24)
    ORDER BY Semestre.Semestre, Nomb

    Lo que yo necesito es pasar el campo "Asignatura" como rotulos de columnas y pivotear el campo "estado" que es de tipo texto.

    Agradecería muchísimo su ayuda por favor.

    Wednesday, December 19, 2012 5:09 AM

Answers

All replies

  • Los resultados que arroja el query de arriba son los siguientes:

    Nomb Semestre Asignatura Estado
    ACOSTA ZAMBRANO NIXON EDUARDO 1 CALCULO I APROBADO
    ACOSTA ZAMBRANO NIXON EDUARDO 1 COMUNICACION TECNICA APROBADO
    ACOSTA ZAMBRANO NIXON EDUARDO 1 CONTABILIDAD GENERAL I APROBADO
    ACOSTA ZAMBRANO NIXON EDUARDO 1 ELECTRICA APROBADO
    ACOSTA ZAMBRANO NIXON EDUARDO 1 GEOMETRIA ANALITICA APROBADO
    ACOSTA ZAMBRANO NIXON EDUARDO 1 LOGICA MATEMATICA APROBADO
    ACOSTA ZAMBRANO NIXON EDUARDO 1 PRACTICAS DE SISTEMAS INFORMATICOS I APROBADO
    ACOSTA ZAMBRANO NIXON EDUARDO 1 PROGRAMACION I APROBADO
    ALAVA CAGUA NATHALY VALERIA 1 CALCULO I APROBADO
    ALAVA CAGUA NATHALY VALERIA 1 COMUNICACION TECNICA APROBADO
    ALAVA CAGUA NATHALY VALERIA 1 CONTABILIDAD GENERAL I APROBADO
    ALAVA CAGUA NATHALY VALERIA 1 ELECTRICA APROBADO

    Lo que yo necesito es pasar el campo "Asignatura" como rotulos de columnas y pivotear el campo "estado" que es de tipo texto.

    • Edited by Cracken3000 Wednesday, December 19, 2012 5:29 AM No salen los resultados bien
    Wednesday, December 19, 2012 5:24 AM
  • Es de mucha ayuda que postees la estructura de las tablas, incluyendo indices y restricciones, asi como data de ejemplo en forma de sentencias "insert" y los resultados esperados. Nosotros no queremos mal gastar nuestro tiempo adivinando tipos de datos, o simulando tu ambiente. Ayudanos para poder ayudarte.

    Dicho lo anterior, chequea este problema el cual usa piuvot dinamico. Si esto es para un reporte, entonces preferible que uses la herramienta de reporte para hacer el pivot.

    http://social.msdn.microsoft.com/Forums/es/sqlserveres/thread/70270b01-2ce9-4c1e-a181-4a9f9804ea17


    AMB

    Some guidelines for posting questions...

    Wednesday, December 19, 2012 1:23 PM
  • Este es el resultado de la consulta sin pivot:

    Nomb

    Semestre

    Asignatura

    Estado

    ACOSTA ZAMBRANO NIXON EDUARDO

    1

    CALCULO I

    APROBADO

    ACOSTA ZAMBRANO NIXON EDUARDO

    1

    COMUNICACION TECNICA

    APROBADO

    ACOSTA ZAMBRANO NIXON EDUARDO

    1

    CONTABILIDAD GENERAL I

    APROBADO

    ALAVA CAGUA NATHALY VALERIA

    1

    CALCULO I

    APROBADO

    ALAVA CAGUA NATHALY VALERIA

    1

    COMUNICACION TECNICA

    APROBADO

    ALAVA CAGUA NATHALY VALERIA

    1

    CONTABILIDAD GENERAL I

    APROBADO

    ALCIVAR CHAVEZ CRISTHIAN GUILLERMO

    1

    CALCULO I

    APROBADO

    ALCIVAR CHAVEZ CRISTHIAN GUILLERMO

    1

    COMUNICACION TECNICA

    APROBADO

    ALCIVAR CHAVEZ CRISTHIAN GUILLERMO

    1

    CONTABILIDAD GENERAL I

    REPROBADO

    Necesito pasar los datos de la columna Asignatura como cabeceras de columnas y pivotear la columna Estado, algo así:

    Nomb

    Semestre

    Calculo

    ComunicaciónT. 

    Contabilidad

    ACOSTA ZAMBRANO NIXON EDUARDO 

    1

    APROBADO

    APROBADO

    APROBADO

    ALAVA CAGUA NATHALY VALERIA

    1

    APROBADO

    APROBADO

    APROBADO

    ALCIVAR CHAVEZ CRISTHIAN GUILLERMO

    1

    APROBADO

    APROBADO

    REPROBADO

    Seria de mucha ayuda que me pases una dirección de correo para enviarte el script del esquema de las tablas y algunos datos, ya que debido a su tamaño no lo puedo postear aquí:

    Monday, December 24, 2012 7:16 PM
  • Hola.

    Puedes subir la información a alguna parte y dejar el link. Comunicarse por mail hace impide la colaboración y aprovechamiento posterior de lo que se trate en la conversación.

    Yendo a lo que comentas, no parece imprescindible que sea un pivot dinámico, estamos hablando de asignaturas, algo que sí puede ser conocido con anterioridad.


    Alberto López Grande
    SQL Server MVP
    Visita mi blog en http://qwalgrande.com
    Sígueme en twitter en http://twitter.com/qwalgrande

    Saturday, December 29, 2012 8:44 PM
  • Hola Alberto.

    Con respecto a lo que dices de la asignatura, si puede ser conocido, pero como puedes ver se manejan muchos cursos y paralelos y seria bastante tedioso hacerlo con pivot estáticos ya que el numero de asignaturas puede variar según el nivel y la especialidad, por eso es mejor que sea automático, y no estoy seguro pero creo que la única manera de hacer eso es con pivot dinámico o utilizando cursores, pero como ya he dicho antes apenas estoy iniciando en esto del T-SQL. De todos modos acá dejo el link del script que contiene la estructura de la bd y algunos datos de ejemplos:

    http://rapidshare.com/files/1400281414/script.sql

    Sunday, December 30, 2012 6:56 PM
  • Mil disculpas con el link anterior he tenido que codificarlo. Acá esta restablecido:

    http://rapidshare.com/files/3986557338/script.txt

    El query que he intentado modificar es el siguiente:

    SELECT     Persona.Apellido_1 +' '+ Persona.Apellido_2 +' '+ Persona.Nombres as Nombres, Semestre.Semestre, Semestre.Paralelo, Asignatura.Nombre AS Asignatura, 
                          Matricula_Asignatura.Estado
    FROM         Persona INNER JOIN
                          Alumno ON Persona.Id_Persona = Alumno.Id_Persona INNER JOIN
                          Matricula ON Alumno.Id_Alumno = Matricula.Id_Alumno INNER JOIN
                          Matricula_Asignatura ON Matricula.Cod_Matricula = Matricula_Asignatura.Cod_Matricula INNER JOIN
                          Asignatura ON Matricula_Asignatura.Cod_Asignatura = Asignatura.Cod_Asignatura INNER JOIN
                          Distribucion ON Asignatura.Cod_Asignatura = Distribucion.Cod_Asignatura INNER JOIN
                          Semestre ON Matricula.Cod_Semestre = Semestre.Cod_Semestre AND Distribucion.Cod_Semestre = Semestre.Cod_Semestre
    WHERE     (Matricula.Cod_Semestre = 27) AND (Matricula.Cod_Periodo = 24) AND (Distribucion.Cod_Periodo = 24)
    order by Nombres

    Saludos y gracias.

    Sunday, December 30, 2012 8:14 PM
  • Hola.

    Si no tienes mucha soltura con T-SQL, la tarea puede ser dantesca. Te dejo un link a otro hilo en el que se trata el mismo tema, con numerosas referencias adicionales además.

    http://social.msdn.microsoft.com/Forums/es-ES/sqlserveres/thread/be0f5b88-282b-4856-8d82-99b93ecf36a5

    Insistiendo en lo que comentaba Alejandro, ¿cómo se realizará la presentación de la información? ¿Es un reporte de Reporting Services o de alguna otra herramienta? Las utilidades de este tipo cuentan con componentes que te ahorrarían tener que implementar esto a base de código.


    Alberto López Grande
    SQL Server MVP
    Visita mi blog en http://qwalgrande.com
    Sígueme en twitter en http://twitter.com/qwalgrande

    Sunday, December 30, 2012 8:29 PM
  • El problema es que yo trabajo con campos tipo texto a los cuales no les puedo hacer un sum, max, o avg y yo necesito presentar todos los valores existentes. En las referencias que me dejaste veo que trabajan con campos tipo numéricos o valores los cuales pueden ser agrupados fácilmente, y también sql dinámico pero al final lo combinan con Pivot.

    Con respecto a lo del tipo de reporte, la información se la presentara en un datagridview para luego ser impresa. El formato de presentación no es de mucha importancia en este caso, lo que mas interesa es que los datos se puedan visualizar. Ademas no estoy utilizando Reporting Services y la version de sql server es Management Studio 2008 R2.

    Me vendría bien una ayuda.

    _________________________________________________________

    Saludos

    Sunday, December 30, 2012 11:30 PM
  • Hola.

    He preparado un post en mi blog en el que expongo una forma de hacer más asequible este tipo de cuestiones, usando tu caso como ejemplo, pero con la idea de que sea sencillo llevar a cabo unas cuantas sustituciones y que se adapte a cualquier otra sentencia que sea necesario pivotar.

    Te dejo el link:

    http://qwalgrande.com/2012/12/31/pivot-dinamico-para-dummies/


    Alberto López Grande
    SQL Server MVP
    Visita mi blog en http://qwalgrande.com
    Sígueme en twitter en http://twitter.com/qwalgrande

    Monday, December 31, 2012 2:53 PM
  • Hola Alberto.

    Es exactamente lo que necesitaba, de esa manera como lo has planteado esta mucho mas claro y amigable el código y se lo puede adaptar a cualquier query donde sea necesario hacer un pivot. La verdad me ha sido de mucha ayuda y espero que le sirva a muchas personas mas que estén en alguna situación parecida.

    Muchas gracias por el aporte y la ayuda esta muy bueno.

    ______________________________________________________

    Saludos

    Monday, December 31, 2012 5:15 PM