none
Contar registros con especificaciones! RRS feed

  • Pregunta

  • Deseo contar todas las P de esta tabla sin repetir el periodo(CCENE06, CONY06, CPER06) es decir en esta imagen la cantidad de P que tiene una registro determinado(EREG06) es 18. Llevo dos dias y no logro realizar una consulta que me lo cuente bien. Se me olvida decir que en las columnas(CT#106, CT#206,CT#306,CT#406,CT#506,CT#606) no solo aparecen P tambien aparecen C y N. Gracias.


    • Editado SPALACIO lunes, 8 de mayo de 2017 13:26 Olvidaba algo!
    lunes, 8 de mayo de 2017 13:22

Respuestas

  • SPALACIO,

    Me alegra que lo hayas logrado por ti mismo.

    Como no sabemos que version de SQL Server usas entonces no se donde estara el error.

    En cuanto a tu Query, no es necesario que uses la cluasula DISTINCT ya que cada grupo es diferente.

       SELECT
        SUM(CT#106 + CT#206 + CT#306 + CT#406 + CT#506 + CT#606) AS Total
       FROM
        (
         SELECT
            CONCAT(CONCAT(CCEN06, CONY06), CPER06),
            MAX((CASE WHEN CT#106 = 'P' THEN 1
                      ELSE 0
                 END)) AS CT#106,
            MAX((CASE WHEN CT#206 = 'P' THEN 1
                      ELSE 0
                 END)) AS CT#206,
            MAX((CASE WHEN CT#306 = 'P' THEN 1
                      ELSE 0
                 END)) AS CT#306,
            MAX((CASE WHEN CT#406 = 'P' THEN 1
                      ELSE 0
                 END)) AS CT#406,
            MAX((CASE WHEN CT#506 = 'P' THEN 1
                      ELSE 0
                 END)) AS CT#506,
            MAX((CASE WHEN CT#606 = 'P' THEN 1
                      ELSE 0
                 END)) AS CT#606
         FROM
            "MI TABLA"
         WHERE
            EREG06 = 1629401
            AND ACTV06 = 'A'
            AND EGIE06 <> 0
         GROUP BY
            CCEN06,
            CONY06,
            CPER06
        ) AS XX;


    AMB

    Some guidelines for posting questions...

    AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas

    • Marcado como respuesta SPALACIO lunes, 8 de mayo de 2017 17:54
    lunes, 8 de mayo de 2017 17:25

Todas las respuestas

  • SPALACIO,

    Cual version de SQL Server usas?

    Si entendi correctamente deseas agrupar por las columnas [CCEN06], [CONY06] y [CPER06] y contar todas las 'P' que aparezcan en las columnas [CT#106], [CT#206], [CT#306], [CT#406], [CT#506] y [CT#606], correcto?

    Entonces te recomiendo transformes columnas a filas (UNPIVOT) usando el operador APPLY.

    with R as (
    select
        A.
    [CCEN06], A.[CONY06], A.[CPER06], B.nombre_col, B.valor_col
    from
        tuTabla as A
        cross apply
        (
        values
            ('CT#106', A.[CT#106]),
             ('CT#206',
    A.[CT#206]),
             ('CT#306',
    A.[CT#306]),
             ('CT#406',
    A.[CT#406]),
             ('CT#506',
    A.[CT#506]),
             ('CT#606',
    A.[CT#606])
        ) as B(nombre_col, valor_col)
    )
    select [CCEN06], [CONY06], [CPER06], count(*) as cnt_P
    from R
    where valor_col = 'P'
    group by [CCEN06], [CONY06], [CPER06];



    AMB

    Some guidelines for posting questions...

    AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas



    lunes, 8 de mayo de 2017 14:09
  • Gracias por respoder Hunchback, La idea es esa contar todas las P pero sin repetirlas en el mismo periodo.

    Es decir cuando las agrupas por ejemplo que es lo que logrado hacer

    20211 1  1  1  1 0  0
    20212   1  2  2  1   0

    Este es codigo que utilizo:

    Select DISTINCT CONCAT(CONCAT(CCEN06,CONY06),CPER06), count((Case when CT#106 = 'P' Then 1 ELSE Null END)) as CT#106, count((Case when CT#206 = 'P' Then 1 ELSE Null END )) as CT#206, count((Case when CT#306 = 'P' Then 1 ELSE Null END)) as CT#306, count((Case when CT#406 = 'P' Then 1 ELSE Null END)) as CT#406, count((Case when CT#506 = 'P' Then 1 ELSE Null END)) as CT#506, count((Case when CT#606 = 'P' Then 1 ELSE Null END)) as CT#606 FROM Mi TABLA Where EREG06 = 1629401 And ACTV06 = 'A' And EGIE06 <> 0

    GROUP BY CCEN06,CONY06, CPER06



    En total tendrias 11 P, pero realmente lo que quiero es contar esto:

    20211 1  1  1  1 0  0
    20212   1  1  1  1   0

    serian 9 P, sin repetir las P que seria semanas trabajadas, no importa que la persona haya trabajado en la misma semana dos veces, yo solo tomare 1 porque realmente fue una sola semana que ella trabajo, realmente los datos los quiero mostrar en VB.Net, leyendolos de AS400, pero con la logica en SQL lo puedo adaptar a mis necesidades.

    Saludos

    Yo 



    • Editado SPALACIO lunes, 8 de mayo de 2017 14:34
    lunes, 8 de mayo de 2017 14:28
  • Por que no pones data de ejemplo y resultados esperados para poder tener con que probar?

    basandome en tu ejemplo diria que no cuentes sino que calcules el maximo.

    SELECT
        CCEN06,
        CONY06,
        CPER06,
        MAX((CASE WHEN CT#106 = 'P' THEN 1 ELSE 0 END)) AS CT#106,
        MAX((CASE WHEN CT#206 = 'P' THEN 1 ELSE 0 END)) AS CT#206,
        MAX((CASE WHEN CT#306 = 'P' THEN 1 ELSE 0 END)) AS CT#306,
        MAX((CASE WHEN CT#406 = 'P' THEN 1 ELSE 0 END)) AS CT#406,
        MAX((CASE WHEN CT#506 = 'P' THEN 1 ELSE 0 END)) AS CT#506,
        MAX((CASE WHEN CT#606 = 'P' THEN 1 ELSE 0 END)) AS CT#606,
    	SUM(
        MAX((CASE WHEN CT#106 = 'P' THEN 1 ELSE 0 END)) +
        MAX((CASE WHEN CT#206 = 'P' THEN 1 ELSE 0 END)) +
        MAX((CASE WHEN CT#306 = 'P' THEN 1 ELSE 0 END)) +
        MAX((CASE WHEN CT#406 = 'P' THEN 1 ELSE 0 END)) +
        MAX((CASE WHEN CT#506 = 'P' THEN 1 ELSE 0 END)) +
        MAX((CASE WHEN CT#606 = 'P' THEN 1 ELSE 0 END))
    	) OVER() AS Total_Ps
    FROM
        Mi TABLA
    WHERE
        EREG06 = 1629401
        AND ACTV06 = 'A'
        AND EGIE06 <> 0
    GROUP BY
        CCEN06,
        CONY06,
        CPER06;


    AMB

    Some guidelines for posting questions...

    AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas

    lunes, 8 de mayo de 2017 16:06
  • Por que no pones data de ejemplo y resultados esperados para poder tener con que probar?

    basandome en tu ejemplo diria que no cuentes sino que calcules el maximo.

    SELECT
        CCEN06,
        CONY06,
        CPER06,
        MAX((CASE WHEN CT#106 = 'P' THEN 1 ELSE 0 END)) AS CT#106,
        MAX((CASE WHEN CT#206 = 'P' THEN 1 ELSE 0 END)) AS CT#206,
        MAX((CASE WHEN CT#306 = 'P' THEN 1 ELSE 0 END)) AS CT#306,
        MAX((CASE WHEN CT#406 = 'P' THEN 1 ELSE 0 END)) AS CT#406,
        MAX((CASE WHEN CT#506 = 'P' THEN 1 ELSE 0 END)) AS CT#506,
        MAX((CASE WHEN CT#606 = 'P' THEN 1 ELSE 0 END)) AS CT#606,
    	SUM(
        MAX((CASE WHEN CT#106 = 'P' THEN 1 ELSE 0 END)) +
        MAX((CASE WHEN CT#206 = 'P' THEN 1 ELSE 0 END)) +
        MAX((CASE WHEN CT#306 = 'P' THEN 1 ELSE 0 END)) +
        MAX((CASE WHEN CT#406 = 'P' THEN 1 ELSE 0 END)) +
        MAX((CASE WHEN CT#506 = 'P' THEN 1 ELSE 0 END)) +
        MAX((CASE WHEN CT#606 = 'P' THEN 1 ELSE 0 END))
    	) OVER() AS Total_Ps
    FROM
        Mi TABLA
    WHERE
        EREG06 = 1629401
        AND ACTV06 = 'A'
        AND EGIE06 <> 0
    GROUP BY
        CCEN06,
        CONY06,
        CPER06;


    AMB

    Some guidelines for posting questions...

    AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas

    Gracias por responder estoy tratando de aplicar este ejemplo que me diste pero me da un error del select, gracias por tu ayuda.

    lunes, 8 de mayo de 2017 16:32
  • Por que no pones data de ejemplo y resultados esperados para poder tener con que probar?

    basandome en tu ejemplo diria que no cuentes sino que calcules el maximo.

    SELECT
        CCEN06,
        CONY06,
        CPER06,
        MAX((CASE WHEN CT#106 = 'P' THEN 1 ELSE 0 END)) AS CT#106,
        MAX((CASE WHEN CT#206 = 'P' THEN 1 ELSE 0 END)) AS CT#206,
        MAX((CASE WHEN CT#306 = 'P' THEN 1 ELSE 0 END)) AS CT#306,
        MAX((CASE WHEN CT#406 = 'P' THEN 1 ELSE 0 END)) AS CT#406,
        MAX((CASE WHEN CT#506 = 'P' THEN 1 ELSE 0 END)) AS CT#506,
        MAX((CASE WHEN CT#606 = 'P' THEN 1 ELSE 0 END)) AS CT#606,
    	SUM(
        MAX((CASE WHEN CT#106 = 'P' THEN 1 ELSE 0 END)) +
        MAX((CASE WHEN CT#206 = 'P' THEN 1 ELSE 0 END)) +
        MAX((CASE WHEN CT#306 = 'P' THEN 1 ELSE 0 END)) +
        MAX((CASE WHEN CT#406 = 'P' THEN 1 ELSE 0 END)) +
        MAX((CASE WHEN CT#506 = 'P' THEN 1 ELSE 0 END)) +
        MAX((CASE WHEN CT#606 = 'P' THEN 1 ELSE 0 END))
    	) OVER() AS Total_Ps
    FROM
        Mi TABLA
    WHERE
        EREG06 = 1629401
        AND ACTV06 = 'A'
        AND EGIE06 <> 0
    GROUP BY
        CCEN06,
        CONY06,
        CPER06;


    AMB

    Some guidelines for posting questions...

    AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas

    Gracias por responder estoy tratando de aplicar este ejemplo que me diste pero me da un error del select, gracias por tu ayuda.

    Gracias nuevamente, la parte que no me funciona me imagino que sea la del Sum con funciones dentro o el Over, pero tratando una y otra vez con tu ejemplo pude lograr que queria, nose si es la forma mas correcta pero llegue al resultado que queria, aqui te dejo la funcion solo dime que arreglar,gracias.
        
        Select sum (CT#106 + CT#206 + CT#306 + CT#406 + CT#506 + CT#606) as Total From(
    
     Select DISTINCT CONCAT(CONCAT(CCEN06,CONY06),CPER06),
        MAX((CASE WHEN CT#106 = 'P' THEN 1 ELSE 0 END)) AS CT#106,
        MAX((CASE WHEN CT#206 = 'P' THEN 1 ELSE 0 END)) AS CT#206,
        MAX((CASE WHEN CT#306 = 'P' THEN 1 ELSE 0 END)) AS CT#306,
        MAX((CASE WHEN CT#406 = 'P' THEN 1 ELSE 0 END)) AS CT#406,
        MAX((CASE WHEN CT#506 = 'P' THEN 1 ELSE 0 END)) AS CT#506,
        MAX((CASE WHEN CT#606 = 'P' THEN 1 ELSE 0 END)) AS CT#606
                                                                FROM  "MI TABLA" Where EREG06 = 1629401 And ACTV06 = 'A' And EGIE06 <> 0  GROUP BY CCEN06,CONY06, CPER06     
                                                 ) AS XX

    • Marcado como respuesta SPALACIO lunes, 8 de mayo de 2017 18:08
    • Desmarcado como respuesta Joyce_ACModerator martes, 9 de mayo de 2017 19:52
    lunes, 8 de mayo de 2017 16:59
  • SPALACIO,

    Me alegra que lo hayas logrado por ti mismo.

    Como no sabemos que version de SQL Server usas entonces no se donde estara el error.

    En cuanto a tu Query, no es necesario que uses la cluasula DISTINCT ya que cada grupo es diferente.

       SELECT
        SUM(CT#106 + CT#206 + CT#306 + CT#406 + CT#506 + CT#606) AS Total
       FROM
        (
         SELECT
            CONCAT(CONCAT(CCEN06, CONY06), CPER06),
            MAX((CASE WHEN CT#106 = 'P' THEN 1
                      ELSE 0
                 END)) AS CT#106,
            MAX((CASE WHEN CT#206 = 'P' THEN 1
                      ELSE 0
                 END)) AS CT#206,
            MAX((CASE WHEN CT#306 = 'P' THEN 1
                      ELSE 0
                 END)) AS CT#306,
            MAX((CASE WHEN CT#406 = 'P' THEN 1
                      ELSE 0
                 END)) AS CT#406,
            MAX((CASE WHEN CT#506 = 'P' THEN 1
                      ELSE 0
                 END)) AS CT#506,
            MAX((CASE WHEN CT#606 = 'P' THEN 1
                      ELSE 0
                 END)) AS CT#606
         FROM
            "MI TABLA"
         WHERE
            EREG06 = 1629401
            AND ACTV06 = 'A'
            AND EGIE06 <> 0
         GROUP BY
            CCEN06,
            CONY06,
            CPER06
        ) AS XX;


    AMB

    Some guidelines for posting questions...

    AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas

    • Marcado como respuesta SPALACIO lunes, 8 de mayo de 2017 17:54
    lunes, 8 de mayo de 2017 17:25
  • SPALACIO,

    Me alegra que lo hayas logrado por ti mismo.

    Como no sabemos que version de SQL Server usas entonces no se donde estara el error.

    En cuanto a tu Query, no es necesario que uses la cluasula DISTINCT ya que cada grupo es diferente.

       SELECT
        SUM(CT#106 + CT#206 + CT#306 + CT#406 + CT#506 + CT#606) AS Total
       FROM
        (
         SELECT
            CONCAT(CONCAT(CCEN06, CONY06), CPER06),
            MAX((CASE WHEN CT#106 = 'P' THEN 1
                      ELSE 0
                 END)) AS CT#106,
            MAX((CASE WHEN CT#206 = 'P' THEN 1
                      ELSE 0
                 END)) AS CT#206,
            MAX((CASE WHEN CT#306 = 'P' THEN 1
                      ELSE 0
                 END)) AS CT#306,
            MAX((CASE WHEN CT#406 = 'P' THEN 1
                      ELSE 0
                 END)) AS CT#406,
            MAX((CASE WHEN CT#506 = 'P' THEN 1
                      ELSE 0
                 END)) AS CT#506,
            MAX((CASE WHEN CT#606 = 'P' THEN 1
                      ELSE 0
                 END)) AS CT#606
         FROM
            "MI TABLA"
         WHERE
            EREG06 = 1629401
            AND ACTV06 = 'A'
            AND EGIE06 <> 0
         GROUP BY
            CCEN06,
            CONY06,
            CPER06
        ) AS XX;


    AMB

    Some guidelines for posting questions...

    AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas

    Gracias nuevamente por tu ayuda Hunchback , realmente sin tus ideas no lo hubiese podido hacer, quitare el DISTINCT.... Mis saludos.

    lunes, 8 de mayo de 2017 17:48