Consulta vertical y mostar horizontal.

Colapsar
X
  • Filtrar
  • Tiempo
  • Mostrar
Limpiar todos
nuevos mensajes

  • Consulta vertical y mostar horizontal.

    Buenas Compañeros:

    Mi problemas es el siguiente haber si alguien me puede ayudar o aclarar, tengo una consulta sql que me debe mostrar todos los medicos residentes y de cuantas personas atendieron por dia en un mes, el rango es todo el mes, al general la consulta me trae toda la informacion del mes pero de manera vertical y el informe debe salir horizontal.

    Código:
    SELECT Med_apellidos AS NOMBRE, Med_nombres AS APELLIDO, Diag_medico_r AS RESIDENTE,Diag_turno AS TURNO,DIA, MES , COUNT (Diag_num_caso) AS CANT
    FROM Vs_Infomre7
    WHERE mes = '1'
    GROUP BY Med_apellidos, Med_nombres, Diag_medico_r, Diag_turno, dia, mes

  • #2
    Re: Consulta vertical y mostar horizontal.

    Originalmente escrito por puchungon Ver mensaje
    Buenas Compañeros:

    Mi problemas es el siguiente haber si alguien me puede ayudar o aclarar, tengo una consulta sql que me debe mostrar todos los medicos residentes y de cuantas personas atendieron por dia en un mes, el rango es todo el mes, al general la consulta me trae toda la informacion del mes pero de manera vertical y el informe debe salir horizontal.

    Código:
    SELECT Med_apellidos AS NOMBRE, Med_nombres AS APELLIDO, Diag_medico_r AS RESIDENTE,Diag_turno AS TURNO,DIA, MES , COUNT (Diag_num_caso) AS CANT
    FROM Vs_Infomre7
    WHERE mes = '1'
    GROUP BY Med_apellidos, Med_nombres, Diag_medico_r, Diag_turno, dia, mes
    Mal podrá ayudarte nadie si sólo facilitas información sobre la SQL de tu consulta. Lo que se precisa es que indiques qué método y qué código usas para PRESENTAR EL REPORT.
    José María Movilla Cuadrado
    ______________________
    Normas del foro
    www.foro.vb-mundo.com
    www.vb-mundo.com

    Comentario


    • #3
      Re: Consulta vertical y mostar horizontal.

      La consulta me trae un listado:

      APELLIDO NOMBRE TURNO DIA MES CANTIDAD DE PACIENTES
      BOLIVAR MARIA JULIA 3 06 01 8
      BRADICA ABELLYS 2 06 01 1
      CAPARÓ ELIZABETH 1 06 01 2
      CAPARÓ ELIZABETH 2 06 01 2
      DE LEÓN YARILIZ 3 06 01 2
      PERROTT LIZ 3 06 01 1
      TRUJILLLO SONIA 1 06 01 1
      TRUJILLLO SONIA 2 06 01 1
      TRUJILLLO SONIA 3 06 01 3
      -------------------------------------------------------------------
      pero la presentacion debe ser de manera horizontal:

      APELLIDO NOMBRE TURNO 1 2 3 4 5 6 7 8 9 10 hasta 31
      BOLIVAR MARIA JULIA 3 8 2 5 0 0 0 0 0 0 0
      BRADICA ABELLYS 2 5 3 4 7 1 1 1 0 0 0

      Comentario


      • #4
        Re: Consulta vertical y mostar horizontal.

        Sigues sin indicar de qué vas a servirte para presentar el informe: DataReport, Crystal Report, Grilla, Excel... Parace que lo haces con Print directo, probablemente el método más inapropiado...
        José María Movilla Cuadrado
        ______________________
        Normas del foro
        www.foro.vb-mundo.com
        www.vb-mundo.com

        Comentario


        • #5
          Re: Consulta vertical y mostar horizontal.

          datareport con vb6

          Comentario


          • #6
            Re: Consulta vertical y mostar horizontal.

            ¿Intentaste por PIVOT?

            ¿Qué VERSION-EDICION de SQL Server usas?
            Ing. Isaías Islas González
            MCP MCTS SQL Server 2008

            Share what you know, learn what you don't

            Comentario


            • #7
              Re: Consulta vertical y mostar horizontal.

              Por si aca checa esto:

              T-SQL - Transpose rows into columns or columns into rows - Database.Tips
              --------------------------------
              Si eres agradecido, obtendrás más...

              YAcosta

              Comentario


              • #8
                Re: Consulta vertical y mostar horizontal.

                El problema es que usamos sql server 2000 y no soporta el pivot.

                Comentario


                • #9
                  Re: Consulta vertical y mostar horizontal.

                  Yo recuerdo que use hace años (AÑOS) transpose incluso en Access, lo hice para un reporte y solo fue una vez, definitivamente no fue SQL Server porque nunca lo use para ninguno de mis proyectos personales.

                  Ahora no me acuerdo exactamente como iba, voy a buscar ese code quiza te sirva
                  --------------------------------
                  Si eres agradecido, obtendrás más...

                  YAcosta

                  Comentario


                  • #10
                    Re: Consulta vertical y mostar horizontal.

                    Buenas compañeros ya úde solucionar una parte del imforme para ser mostrado como lo requieren les explico lo que hice:

                    1- Se creo una vista general con los datos del informe. (Vs_Informe8).

                    2- Luego a la vista le ejecuto la consulta condicionada por rango de busqueda ya que es fecha1 y fecha2 (Mensual).

                    Código:
                    SELECT APELLIDO, NOMBRE, TURNO,
                    SUM (CASE DATEPART(D,FECHA)WHEN 1 THEN 1 ELSE 0 END) AS D1, 
                    SUM (CASE DATEPART(D,FECHA)WHEN 2 THEN 1 ELSE 0 END) AS D2, 
                    SUM (CASE DATEPART(D,FECHA)WHEN 3 THEN 1 ELSE 0 END) AS D3, 
                    SUM (CASE DATEPART(D,FECHA)WHEN 4 THEN 1 ELSE 0 END) AS D4, 
                    SUM (CASE DATEPART(D,FECHA)WHEN 5 THEN 1 ELSE 0 END) AS D5, 
                    SUM (CASE DATEPART(D,FECHA)WHEN 6 THEN 1 ELSE 0 END) AS D6, 
                    SUM (CASE DATEPART(D,FECHA)WHEN 7 THEN 1 ELSE 0 END) AS D7,
                    SUM (CASE DATEPART(D,FECHA)WHEN 8 THEN 1 ELSE 0 END) AS D8,
                    SUM (CASE DATEPART(D,FECHA)WHEN 9 THEN 1 ELSE 0 END) AS D9,
                    SUM (CASE DATEPART(D,FECHA)WHEN 10 THEN 1 ELSE 0 END) AS D10,
                    SUM (CASE DATEPART(D,FECHA)WHEN 11 THEN 1 ELSE 0 END) AS D11,
                    SUM (CASE DATEPART(D,FECHA)WHEN 12 THEN 1 ELSE 0 END) AS D12,
                    SUM (CASE DATEPART(D,FECHA)WHEN 13 THEN 1 ELSE 0 END) AS D13,
                    SUM (CASE DATEPART(D,FECHA)WHEN 14 THEN 1 ELSE 0 END) AS D14,
                    SUM (CASE DATEPART(D,FECHA)WHEN 15 THEN 1 ELSE 0 END) AS D15,
                    SUM (CASE DATEPART(D,FECHA)WHEN 16 THEN 1 ELSE 0 END) AS D16,
                    SUM (CASE DATEPART(D,FECHA)WHEN 17 THEN 1 ELSE 0 END) AS D17,
                    SUM (CASE DATEPART(D,FECHA)WHEN 18 THEN 1 ELSE 0 END) AS D18,
                    SUM (CASE DATEPART(D,FECHA)WHEN 19 THEN 1 ELSE 0 END) AS D19,
                    SUM (CASE DATEPART(D,FECHA)WHEN 20 THEN 1 ELSE 0 END) AS D20,
                    SUM (CASE DATEPART(D,FECHA)WHEN 21 THEN 1 ELSE 0 END) AS D21,
                    SUM (CASE DATEPART(D,FECHA)WHEN 22 THEN 1 ELSE 0 END) AS D22,
                    SUM (CASE DATEPART(D,FECHA)WHEN 23 THEN 1 ELSE 0 END) AS D23,
                    SUM (CASE DATEPART(D,FECHA)WHEN 24 THEN 1 ELSE 0 END) AS D24,
                    SUM (CASE DATEPART(D,FECHA)WHEN 25 THEN 1 ELSE 0 END) AS D25,
                    SUM (CASE DATEPART(D,FECHA)WHEN 26 THEN 1 ELSE 0 END) AS D26,
                    SUM (CASE DATEPART(D,FECHA)WHEN 27 THEN 1 ELSE 0 END) AS D27,
                    SUM (CASE DATEPART(D,FECHA)WHEN 28 THEN 1 ELSE 0 END) AS D28,
                    SUM (CASE DATEPART(D,FECHA)WHEN 29 THEN 1 ELSE 0 END) AS D29,
                    SUM (CASE DATEPART(D,FECHA)WHEN 30 THEN 1 ELSE 0 END) AS D30,
                    SUM (CASE DATEPART(D,FECHA)WHEN 31 THEN 1 ELSE 0 END) AS D31,
                    COUNT (CASO) AS TOTAL 
                    FROM Vs_Infomre8
                    WHERE FECHA BETWEEN '01/01/2015' and '31/01/2015' --AND APELLIDO = 'ARAUZ'
                    GROUP BY APELLIDO, NOMBRE, DIA, TURNO
                    ORDER BY DIA
                    3- El problema esta no me agrupa el nombre del medico y el turno, ya que si tengo a el medico ejemplo: VIDAL KATHIANA SOLO ME DEBE APARECER UNA SOLO VES PARA EL TURNO 1 Y UNO VEZ PARA EL TURNO 2, DE ESTA MANERA VIDAL KATHIANA TUENO 1 DIA 2 (1 PACIENTE) Y EL DIA 3 DEL MISMO TURNO 1(3 PACIENTE), me explico compañeros.

                    Código:
                                  APELLIDO   NOMBRE   TURNO   1
                      2   3   4   5       ARAUZ   YARIELA   1   1   0   0   0   0       BRADICA   ABELLYS   1   3   0   0   0   0       BRADICA   ABELLYS   2   1   0   0   0   0       DE LEÓN   YARILIZ   1   7   0   0   0   0       DE LEÓN   YARILIZ   2   1   0   0   0   0       DE LEÓN   YARILIZ   3   1   0   0   0   0       FERNÁNDEZ   MARISTELA   3   1   0   0   0   0       GALÁN   GISELLE   1   8   0   0   0   0       RIOS   MILZANETH   1   1   0   0   0   0       UREÑA   EDGARDO   2   1   0   0   0   0       VASQUEZ   MANUEL   2   1   0   0   0   0       VASQUEZ   MANUEL   3   1   0   0   0   0       ARAUZ   YARIELA   2   0   3   0   0   0       GALÁN   GISELLE   2   0   3   0   0   0       VIDAL   KATHIANA   1   0   1   0   0   0       VIDAL   KATHIANA   2   0   6   0   0   0       ARAUZ   YARIELA   1   0   0   8   0   0       GALÁN   GISELLE   1   0   0   4   0   0       GALÁN   GISELLE   2   0   0   12   0   0       VIDAL   KATHIANA   1   0   0   3   0   0       VIDAL   KATHIANA   2   0   0   5   0   0
                    Ayuda porfa que esta mal en la consulta.

                    Comentario


                    • #11
                      Re: Consulta vertical y mostar horizontal.

                      Hola puchungon, espero hayas resuelto el problema, si no tal vez esto te sea útil.

                      Primero aclaro que esta explicación parte de cero, porque desconozco la estructura de las tablas, que es imprescindible para resolver este tipo de problemas.


                      Suponiendo que existe la tabla:


                      Código:
                      Atenciones
                        * ID
                        FK_Medico
                        FK_Turno
                        FK_Paciente
                        Fecha
                      Resulta sencillo mostrar un informe del total de pacientes atendidos por fecha, médico y turno, en ese orden, claro que el listado saldrá en forma vertical:

                      Como vemos, primero se agrupa por fecha (1ª columna), luego por médico (2ª columna) y finalmente por turno.

                      La SQL que logra esto es:
                      Código:
                      Select      Fecha, FK_Medico, FK_Turno, COUNT(FK_Paciente) AS Pacientes
                      From        Atenciones
                      group by    Fecha, FK_Medico, FK_Turno
                      Se va a realizar una cuenta distinta por cada combinación de fecha, médico y turno que haya en la tabla.


                      En este ejemplo, para simplificar, sólo se tiene en cuenta 2 fechas, 3 médicos y 2 turnos; pero tranquilamente esas cifras pueden cambiar.
                      El problema surge cuando deseamos trasponer las fechas horizontalmente:

                      Como vemos, las fechas pasan a ocupar el lugar de la columna Pacientes, o mejor dicho, la columna Pacientes pasaría a llamarse “Pacientes atendidos en los días…”, y tendría tantas sub-columnas como días tiene el mes:

                      Como se puede apreciar, se redujo la cantidad de filas; porque antes, al agrupar por fechas, se necesitaba repetir los médicos para cada fecha en particular. Ahora eso no es necesario, porque las fechas están en columnas, permitiendo la intersección con los médicos, que están en filas, ahora que pasaron a ocupar la 1ª columna.


                      Pues bien, para hacer esto podemos:
                      1. Desde el lenguaje consultar la BD, usando la SQL vista anteriormente, y luego con cortes de control ir confeccionando el informe.
                      2. Hacer lo mismo pero desde el lado del motor, usando cursores.
                      3. Usar consultas anidadas, que en este caso sería un terror al tener 31 días (31 sub-consultas además de la principal).
                      4. Usar PIVOT (SQL Server® 2005 en adelante).
                      5. Usar CASE.
                      6. Implementar el método Rozenshtein-Abramovich-Birger, como se menciona en:
                      http://stackoverflow.com/questions/152770/transpose-a-set-of-rows-as-columns-in-sql-server-2000/169412#169412

                      El último tiene fama de ser el mejor método, pero vamos a usar el CASE que es la solución aportada por IIslas y está muy bien, lo único que te confundió es el group by en el que incluiste la fecha, que no debe ir allí, porque ya la traspusiste en columnas. Por lo tanto la SQL sería:


                      Código:
                      
                      Select FK_Medico, FK_Turno,
                                                 [ 1] = sum(case DAY(fecha) when  1 then 1 else 0 end),
                                                 [ 2] = sum(case DAY(fecha) when  2 then 1 else 0 end),
                                                 [ 3] = sum(case DAY(fecha) when  3 then 1 else 0 end),
                      ...,
                      ...,
                      ...,
                                                 [29] = sum(case DAY(fecha) when  29 then 1 else 0 end),
                                                 [30] = sum(case DAY(fecha) when  30 then 1 else 0 end),
                                                 [31] = sum(case DAY(fecha) when  31 then 1 else 0 end)
                      From Atenciones
                      Group by FK_Turno, FK_Medico
                      
                      Hay que tener en cuenta que en esta SQL se está trabajando con la tabla principal de Atenciones y no con una tabla temporal o vista.


                      El group by agrupa primero por turnos y luego por médicos, para mostrar el resultado ordenado por médicos y luego por turnos. Es curioso este comportamiento en SQL Server, desconozco el motivo


                      En lugar de DATEPART, que está muy bien, utilizo DAY que es otra alternativa.
                      Saludos.

                      Comentario


                      • #12
                        Re: Consulta vertical y mostar horizontal.

                        ¿De donde sacas la columnas DIA?
                        Ing. Isaías Islas González
                        MCP MCTS SQL Server 2008

                        Share what you know, learn what you don't

                        Comentario


                        • #13
                          Re: Consulta vertical y mostar horizontal.

                          Hola IIslas, si me permite usted la intromisión, me parece que puchungon saca la columna DIA de lo que parecería ser un cálculo previo con DATEPART, situándola en una vista con el objetivo de facilitar la confección de la SQL final; pero esto es solo una suposición que se puede evitar si contáramos con toda la información, me parece que en este caso sería conveniente conocer la estructura con la que estamos tratando, llámese tabla, vista, etc...
                          Saludos.

                          Comentario

                          Trabajando...
                          X