Tengo una tabla sql que contiene el sitio, el mes, el recuento proyectado y el recuento real. El recuento proyectado se almacena como un valor acumulativo de mi cliente. El recuento real es un valor derivado de otra tabla.

A continuación se muestra la captura de pantalla de los datos de la tabla.

enter image description here

Quiero encontrar el recuento acumulativo de los datos de Cnt real para cada mes y según el sitio. He hecho esto en función de la siguiente consulta y funciona bien.

SELECT DISTINCT
[SiteID] ,
ActualCount ,
CONVERT(DATETIME, [Month], 106) AS [Month] ,
EventName ,
EventValue
FROM ( SELECT DISTINCT
[SiteID] ,
ActualCount ,
[Month] ,
CASE WHEN [ActualCount] IS NULL
THEN ISNULL(SUM([ActualCount]) OVER ( PARTITION BY [SiteID]
ORDER BY CONVERT(DATETIME, [Month], 106) ),
0)
ELSE ISNULL(SUM([ActualCount]) OVER ( PARTITION BY [SiteID]
ORDER BY CONVERT(DATETIME, [Month], 106) ),
0)
END AS CumActSum ,
ISNULL(SUM([ProjectedCount]) OVER ( PARTITION BY [Month],
[SiteID] ORDER BY [Month]
),
0) AS CumProSum
FROM [db_Temp].[dbo].[tbl_site_projection]
) AS src UNPIVOT ( EventValue FOR EventName IN ( CumActSum, CumProSum ) ) AS
UPV

La salida del código anterior es

enter image description here

El problema es el requisito de mi cliente. Si observa los datos, no hay un recuento real para el mes de diciembre para todos los ID de sitio y es NULL

Según el requisito de mi cliente, si no hay un recuento real para todos los ID de sitio durante un mes, entonces el recuento acumulativo para ese mes debe ser cero. No debemos mostrar el recuento acumulativo de ese mes.

Intenté modificar el código considerando la condición como CUANDO ActualCount ES NULO ENTONCES 0. Pero esto también elimina el recuento acumulativo del mes de noviembre.

Básicamente, lo que quieren es siempre que el recuento real sea nulo para todos los sitios, el recuento acumulativo no debe mostrarse para ese mes y tenemos que mostrar 0.

A continuación se muestra el resultado esperado que estoy buscando.

enter image description here

Aquí está el SQL Fiddle

Hubo algún problema en el violín sql, por lo tanto, acabo de construir el esquema en eso.

¿Alguien puede ayudarme con esto?

2
Kannan Athmanathan 27 ene. 2016 a las 08:45

2 respuestas

La mejor respuesta

Cambie su declaración de caso para verificar si la suma acumulada del recuento real es nula para el mes y si es nula o 0, entonces téngala como 0.

SELECT DISTINCT
        [SiteID] ,
        ActualCount ,
        CONVERT(DATETIME, [Month], 106) AS [Month] ,
        EventName ,
        EventValue
FROM    ( SELECT DISTINCT
                    [SiteID] ,
                    ActualCount ,
                    [Month] ,
                    CASE WHEN SUM([ActualCount]) OVER ( PARTITION BY [Month]) IS NULL
                         THEN 0
                         ELSE ISNULL(SUM([ActualCount]) OVER ( PARTITION BY [SiteID] ORDER BY CONVERT(DATETIME, [Month], 106) ),
                                     0)
                    END AS CumActSum ,
                    ISNULL(SUM([ProjectedCount]) OVER ( PARTITION BY [Month],
                                                        [SiteID] ORDER BY [Month] ),
                           0) AS CumProSum 
          FROM      [db_Temp].[dbo].[tbl_site_projection] GROUP BY [SiteID] ,
                    ActualCount ,
                    [Month], [ProjectedCount] 
        ) AS src UNPIVOT ( EventValue FOR EventName IN ( CumActSum, CumProSum ) ) AS UPV
        WHERE TrialMonth LIKE 'Dec%' AND EventName = 'CumActSum'
        ORDER BY CONVERT(DATETIME, [Month], 106), SiteID
1
Karthik Venkatraman 27 ene. 2016 a las 07:11

¿Por qué no puedes manejar null directamente entonces?

    SELECT DISTINCT
    [SiteID] ,
    ISNULL(ActualCount ,0),  --Here I handle NULL
    CONVERT(DATETIME, [Month], 106) AS [Month] ,
    EventName ,
    EventValue
    FROM ( SELECT DISTINCT
    [SiteID] ,
    ActualCount ,
    [Month] ,
    CASE WHEN [ActualCount] IS NULL
    THEN ISNULL(SUM([ActualCount]) OVER ( PARTITION BY [SiteID]
    ORDER BY CONVERT(DATETIME, [Month], 106) ),
    0)
    ELSE ISNULL(SUM([ActualCount]) OVER ( PARTITION BY [SiteID]
    ORDER BY CONVERT(DATETIME, [Month], 106) ),
    0)
    END AS CumActSum ,
    ISNULL(SUM([ProjectedCount]) OVER ( PARTITION BY [Month],
    [SiteID] ORDER BY [Month]
    ),
    0) AS CumProSum
    FROM [db_Temp].[dbo].[tbl_site_projection]
    ) AS src UNPIVOT ( EventValue FOR EventName IN ( CumActSum, CumProSum ) ) AS
    UPV

De lo contrario, realice modificaciones en la consulta interna como se muestra a continuación y creo que no hay necesidad de una condición de caso. Está manejando nulo después de la suma. Pruebe el manejo nulo antes de la suma. También podría evitar algunos problemas graves.

    SELECT DISTINCT
    [SiteID] ,
    ActualCount 
    CONVERT(DATETIME, [Month], 106) AS [Month] ,
    EventName ,
    EventValue
    FROM (
     SELECT DISTINCT
    [SiteID] ,
    ActualCount ,
    [Month] ,
    CASE WHEN [ActualCount] IS NULL
    THEN SUM(ISNULL([ActualCount],0)) OVER ( PARTITION BY [SiteID] --change will be here
    ORDER BY CONVERT(DATETIME, [Month], 106) ),
    0)
    ELSE SUM(ISNULL([ActualCount],0)) OVER ( PARTITION BY [SiteID] --change will be here
    ORDER BY CONVERT(DATETIME, [Month], 106) ),
    0)
    END AS CumActSum ,
    ISNULL(SUM([ProjectedCount]) OVER ( PARTITION BY [Month],
    [SiteID] ORDER BY [Month]
    ),
    0) AS CumProSum
    FROM [db_Temp].[dbo].[tbl_site_projection]
    ) AS src UNPIVOT ( EventValue FOR EventName IN ( CumActSum, CumProSum ) ) AS
    UPV
0
Shakeer Mirza 27 ene. 2016 a las 06:19