none
Ayuda con query para mostrar resultados en una linea RRS feed

  • Pregunta

  • Buen dia,

    Tengo un query que me da los resultos de una manera que no los necesito.

    En lugar de 4 resultados, necesito que solo me traiga 2, es decir en la primer columna me muestre 33 y la segunda 13....y no los null.

    Ya probe con isnull con wheres, etc.

    Algun norte?



    CarloS

    jueves, 24 de noviembre de 2016 18:52

Respuestas

  • Sigue saliendo como moestre en la imgen haciendo el where.

    CarloS

    Lo siento, error mio. No debes realizar la última agrupación, la consulta debería quedarte de la siguiente manera:

    SELECT 
        COUNT(CASE WHEN Resultado='NEG' THEN Resultado END) AS ResultadoNEG,
        COUNT(CASE WHEN Resultado='POS' THEN Resultado END) AS ResultadoPOS
    FROM 
        (...) Tabla88 


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta CarlosSA jueves, 24 de noviembre de 2016 23:45
    jueves, 24 de noviembre de 2016 20:40

Todas las respuestas

  • CarlosSA,

    ¿Podrías adjuntar la consulta sql como texto?


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    jueves, 24 de noviembre de 2016 19:00
  • Si no posteas la consulta y datos de prueba en forma de INSERT es dificil apoyarte por el tiempo que se invierte, lo otro que te puede sugerir es que procures no tener consultas asi de grandes en extension (joins) y mucho menos con tablas derivadas como las que tienes alli, de hecho te sugiero que uses CTE y procures usar tablas temporales para dividir en unidades de trabajo mas manejable, de hecho te apuesto que el Plan de Ejecucion de esa consulta tendra una cantidad incombustible de operadores.

    "Oh, the wind, the wind is blowing,through the graves the wind is blowing,Freedom soon will come; then well come from the shadows".The Partisan(Leonard Cohen) Email: me[at]geohernandez.net Blog:www.geohernandez.net

    jueves, 24 de noviembre de 2016 19:15
  • Disculpen, aqui esta como texto.

    SELECT CASE WHEN Resultado='NEG' THEN COUNT(Resultado) end as ResultadoNEG,
    CASE WHEN Resultado='POS' THEN COUNT(Resultado) end as ResultadoPOS
     FROM (
    SELECT  Familia, CASE WHEN ((100-((Sum(Total)*100)/PptoFecha))*-1)<0 THEN 'NEG' else 'POS' end as Resultado
    FROM (
    SELECT T5.Name as Familia, ProdA, isnull(GBruta,0) as GBruta,isnull(Margen,0) as Margen,NumDia,NumdiasMes,
    (CASE WHEN isnull(total,0)<>0 THEN CAST(T5.U_ACUMULADO as numeric) else CAST(T5.U_ACUMULADO as numeric) END) AS Pronostico,
    DATEADD(yy,DATEDIFF(yy,0,GETDATE()),0) as FechaInicial,
    (getdate()) as FechaFinal,
    isnull(total,0) as Total,DiasRestantes,
    CASE 
    WHEN isnull(total,0)<='0' THEN (CAST(T5.U_ACUMULADO as numeric)/365)*304
    WHEN isnull(total,0)>'0' THEN ((CAST(((CAST(T5.U_ACUMULADO as numeric)/365)*304) as numeric))) END as PptoFecha 

    FROM [dbo].[@PRONOSTICOS2016] T5 left join (
     SELECT 
        T3.ItmsGrpNam Name,sum(T1.[TotalSumSy]) as Total, 
      sum(T1.GrssProfSC) as 'GBruta', T3.U_gpo1 as ProdA,
     (sum(T1.GrssProfSC)/NULLIF(sum(T1.[TotalSumSy]),0))*100 as Margen, 
    (datepart(day,getdate())) as NumDia,
    DAY(EOMONTH(DATEADD(ms,-3,DATEADD(mm,0,DATEADD(mm,DATEDIFF(mm,0,GETDATE())+1,0))))) as NumDiasMes,
    DATEDIFF(DAY, getdate(),(DATEADD(ms,-3,DATEADD(yy,0,DATEADD(yy,DATEDIFF(yy,0,GETDATE())+1,0))))) as DiasRestantes
    FROM
        OITB T3
        INNER JOIN OITM T2 ON T2.ItmsGrpCod = T3.ItmsGrpCod
        LEFT JOIN INV1 T1 ON T1.ItemCode = T2.ItemCode
      AND T1.[DocDate] >= '20160101'
      AND T1.[DocDate] <= '20161031'
      AND T1.TargetType <> '14' AND EXISTS (SELECT 1 FROM OSLP T4 WHERE (T1.[SlpCode] = T4.[SlpCode]) 
     AND (T4.Memo<>'VentasOEM'))
     GROUP BY T3.ItmsGrpNam,T3.U_gpo1) x on T5.Name = x.Name)tabla9 
     GROUP BY Familia,PptoFecha ) Tabla88 
     GROUP BY Resultado


    CarloS

    jueves, 24 de noviembre de 2016 19:21
  • Es un query inicial que uso en reporting services, hice 2 subquerys solo para hacer el count, como veras no soy muy diestro en sql....

    Pero si, tienes razon....es lento al ejecutar.


    CarloS

    jueves, 24 de noviembre de 2016 19:24
  • Consejo, puedes descargarte SQL Prompt de la empresa Red-Gate, es una herramienta genial y a mi me vino super bien para poder aplicacion identacion en esta consulta que parece una TV Mexicana, muy enrevesada y poco instructica :-) , pero tranquilo que todo comienzo es asi

    SELECT  CASE WHEN Resultado = 'NEG' THEN COUNT(Resultado)
            END AS ResultadoNEG ,
            CASE WHEN Resultado = 'POS' THEN COUNT(Resultado)
            END AS ResultadoPOS
    FROM    ( SELECT    Familia ,
                        CASE WHEN ( ( 100 - ( ( SUM(Total) * 100 ) / PptoFecha ) )
                                    * -1 ) < 0 THEN 'NEG'
                             ELSE 'POS'
                        END AS Resultado
              FROM      ( SELECT    T5.Name AS Familia ,
                                    ProdA ,
                                    ISNULL(GBruta, 0) AS GBruta ,
                                    ISNULL(Margen, 0) AS Margen ,
                                    NumDia ,
                                    NumDiasMes ,
                                    ( CASE WHEN ISNULL(Total, 0) <> 0
                                           THEN CAST(T5.U_ACUMULADO AS NUMERIC)
                                           ELSE CAST(T5.U_ACUMULADO AS NUMERIC)
                                      END ) AS Pronostico ,
                                    DATEADD(yy, DATEDIFF(yy, 0, GETDATE()), 0) AS FechaInicial ,
                                    ( GETDATE() ) AS FechaFinal ,
                                    ISNULL(Total, 0) AS Total ,
                                    DiasRestantes ,
                                    CASE WHEN ISNULL(Total, 0) <= '0'
                                         THEN ( CAST(T5.U_ACUMULADO AS NUMERIC)
                                                / 365 ) * 304
                                         WHEN ISNULL(Total, 0) > '0'
                                         THEN ( (CAST(( ( CAST(T5.U_ACUMULADO AS NUMERIC)
                                                          / 365 ) * 304 ) AS NUMERIC)) )
                                    END AS PptoFecha
                          FROM      [dbo].[@PRONOSTICOS2016] T5
                                    LEFT JOIN ( SELECT  T3.ItmsGrpNam Name ,
                                                        SUM(T1.[TotalSumSy]) AS Total ,
                                                        SUM(T1.GrssProfSC) AS 'GBruta' ,
                                                        T3.U_gpo1 AS ProdA ,
                                                        ( SUM(T1.GrssProfSC)
                                                          / NULLIF(SUM(T1.[TotalSumSy]),
                                                                  0) ) * 100 AS Margen ,
                                                        ( DATEPART(DAY, GETDATE()) ) AS NumDia ,
                                                        DAY(EOMONTH(DATEADD(ms, -3,
                                                                  DATEADD(mm, 0,
                                                                  DATEADD(mm,
                                                                  DATEDIFF(mm, 0,
                                                                  GETDATE()) + 1,
                                                                  0))))) AS NumDiasMes ,
                                                        DATEDIFF(DAY, GETDATE(),
                                                                 ( DATEADD(ms, -3,
                                                                  DATEADD(yy, 0,
                                                                  DATEADD(yy,
                                                                  DATEDIFF(yy, 0,
                                                                  GETDATE()) + 1,
                                                                  0))) )) AS DiasRestantes
                                                FROM    OITB T3
                                                        INNER JOIN OITM T2 ON T2.ItmsGrpCod = T3.ItmsGrpCod
                                                        LEFT JOIN INV1 T1 ON T1.ItemCode = T2.ItemCode
                                                                  AND T1.[DocDate] >= '20160101'
                                                                  AND T1.[DocDate] <= '20161031'
                                                                  AND T1.TargetType <> '14'
                                                                  AND EXISTS ( SELECT
                                                                  1
                                                                  FROM
                                                                  OSLP T4
                                                                  WHERE
                                                                  ( T1.[SlpCode] = T4.[SlpCode] )
                                                                  AND ( T4.Memo <> 'VentasOEM' ) )
                                                GROUP BY T3.ItmsGrpNam ,
                                                        T3.U_gpo1
                                              ) x ON T5.Name = x.Name
                        ) tabla9
              GROUP BY  Familia ,
                        PptoFecha
            ) Tabla88
    GROUP BY Resultado;

    Asi que te sugiero, comenzar tomando tus consultas mas internas y sacarlas afuera, es decir:

    --DECLARA TU VARIABLE TIPO TABLA
    DECLARE @MiVariableTabla AS TABLE
    ( Col1  INT, Col2 INT,.....)
    
    INSERT INTO @MiVariableTabla
    
    SELECT  T3.ItmsGrpNam Name ,
            SUM(T1.[TotalSumSy]) AS Total ,
            SUM(T1.GrssProfSC) AS 'GBruta' ,
            T3.U_gpo1 AS ProdA ,
            ( SUM(T1.GrssProfSC) / NULLIF(SUM(T1.[TotalSumSy]), 0) ) * 100 AS Margen ,
            ( DATEPART(DAY, GETDATE()) ) AS NumDia ,
            DAY(EOMONTH(DATEADD(ms, -3,
                                DATEADD(mm, 0,
                                        DATEADD(mm, DATEDIFF(mm, 0, GETDATE()) + 1,
                                                0))))) AS NumDiasMes ,
            DATEDIFF(DAY, GETDATE(),
                     ( DATEADD(ms, -3,
                               DATEADD(yy, 0,
                                       DATEADD(yy, DATEDIFF(yy, 0, GETDATE()) + 1,
                                               0))) )) AS DiasRestantes
    FROM    OITB T3
            INNER JOIN OITM T2 ON T2.ItmsGrpCod = T3.ItmsGrpCod
            LEFT JOIN INV1 T1 ON T1.ItemCode = T2.ItemCode
                                 AND T1.[DocDate] >= '20160101'
                                 AND T1.[DocDate] <= '20161031'
                                 AND T1.TargetType <> '14'
                                 AND EXISTS ( SELECT    1
                                              FROM      OSLP T4
                                              WHERE     ( T1.[SlpCode] = T4.[SlpCode] )
                                                        AND ( T4.Memo <> 'VentasOEM' ) )
    GROUP BY T3.ItmsGrpNam ,
            T3.U_gpo1;                                        
    De esta manera podras ir probando de forma segmentada que resultado te estas trayendo, en resumen, divide y venceras, no te preocupes que por experiencia el resultado siempre sera mejor y sobre todo mas legible.


    "Oh, the wind, the wind is blowing,through the graves the wind is blowing,Freedom soon will come; then well come from the shadows".The Partisan(Leonard Cohen) Email: me[at]geohernandez.net Blog:www.geohernandez.net

    jueves, 24 de noviembre de 2016 19:32
  • Sigue saliendo como moestre en la imgen haciendo el where.

    CarloS

    jueves, 24 de noviembre de 2016 20:24
  • Buscare como hacer ese movimiento.......ahorita tengo que resolverlo asi y ya despues que se vea lo empiezo a cambiar....muchas gracias por las recomendaciones.


    CarloS

    jueves, 24 de noviembre de 2016 20:25
  • Sigue saliendo como moestre en la imgen haciendo el where.

    CarloS

    Lo siento, error mio. No debes realizar la última agrupación, la consulta debería quedarte de la siguiente manera:

    SELECT 
        COUNT(CASE WHEN Resultado='NEG' THEN Resultado END) AS ResultadoNEG,
        COUNT(CASE WHEN Resultado='POS' THEN Resultado END) AS ResultadoPOS
    FROM 
        (...) Tabla88 


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta CarlosSA jueves, 24 de noviembre de 2016 23:45
    jueves, 24 de noviembre de 2016 20:40
  • Ya no salen los null pero ahora salen ceros con el cambio en el COUNT(CASE.....


    ResultadoNEG   ResultadoPOS

        33                0
         0                       13


    CarloS

    jueves, 24 de noviembre de 2016 21:40
  • Como esta hecha la query ( asi, con cte o lo que sea) no influye en el resultado que el busca.

    Con esto sale solo en un renglon

    with cte as (

    SELECT CASE WHEN Resultado='NEG' THEN COUNT(Resultado) end as ResultadoNEG,
    CASE WHEN Resultado='POS' THEN COUNT(Resultado) end as ResultadoPOS
     FROM  (...) tabla88 group by resultado)

    select sum(resultadoneg),sum(resultadopos) from cte  where resultadoneg is not null or resultadopos is not null
    jueves, 24 de noviembre de 2016 23:16
  • Ya no salen los null pero ahora salen ceros con el cambio en el COUNT(CASE.....


    ResultadoNEG   ResultadoPOS

        33                0
         0                       13


    CarloS

    ¿Estás seguro haber retirado la cláusula GROUP BY?

    ¿Podrías colocar el código que tienes con los cambios realizados?


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    jueves, 24 de noviembre de 2016 23:37
  • Ups.....tienes razon.....no lo quite.

    Asi como lo pusiste ya me da el resultado buscado.

    Muchas gracias!!


    CarloS

    jueves, 24 de noviembre de 2016 23:45