获取按月分组的计数

时间:2014-09-16 15:25:37

标签: sql sql-server sql-server-2008

大家好,我有下一个查询

DECLARE @fechaInicio AS VARCHAR(10) 
DECLARE @fechaFin AS VARCHAR(10) 
DECLARE @codGestor AS VARCHAR(10) 
DECLARE @codSponsor AS VARCHAR(10) 
DECLARE @codProducto AS VARCHAR(10)

SET @fechaInicio = '20140101' 
SET @fechaFin = '20141231' 
SET @codGestor = 'BDOBRASIL' 
SET @codSponsor = 'MARCH' 
SET @codProducto = 8


SELECT 
   COUNT(crt_numinterno_id) * 100.00 / pnc_cantidad AS Ventas,
   prd_descripcion, 
   DATENAME(MM, crt_fecinivige) + ' ' + CAST(YEAR(crt_fecinivige) AS VARCHAR(4)) AS crt_fecinivige, 
   C.prd_producto_id,pnc_cantidad 
FROM Certificados C 
INNER JOIN Penetracion P 
   ON C.ges_gestor_id = P.ges_gestor_id 
   AND C.spo_sponsor_id = P.spo_sponsor_id 
   AND C.prd_producto_id = P.prd_producto_id 
LEFT JOIN Productos R 
   ON C.ges_gestor_id = R.ges_gestor_id 
   AND C.spo_sponsor_id = R.spo_sponsor_id 
   AND C.prd_producto_id = R.prd_producto_id 
WHERE C.ges_gestor_id = @codGestor 
   AND C.spo_sponsor_id = @codSponsor 
   AND (@codProducto = '' OR @codProducto = C.prd_producto_id) 
   AND crt_fechabaja IS NULL 
   AND crt_fecinivige BETWEEN @fechaInicio AND @fechaFin 
GROUP BY 
   pnc_cantidad,
   prd_descripcion,
   DATENAME(MM, crt_fecinivige),
   YEAR(crt_fecinivige), 
   DATEPART(yyyy,crt_fecinivige),
   C.prd_producto_id,
   DATEPART(m,crt_fecinivige) 
ORDER BY 
   DATEPART(yyyy,crt_fecinivige),
   DATEPART(m,crt_fecinivige)

我得到下一个结果检查图像

enter image description here

一切都很好但我9月只得到Ventas而我的老板希望查看@fechaInicio@fechaFin之间的所有月份,而且我不知道如何将所有月份分组

1 个答案:

答案 0 :(得分:1)

您可以使用公用表表达式生成一个包含月份序列的表,然后使用该表继续加入查询。在此示例中,我使用20140101作为确定范围开始的日期。请试一试。

;WITH cte (dt) AS (
SELECT DATEADD(MONTH, v.number, '20140101') 
FROM master..spt_values v 
WHERE
   v.number >= 0 AND
   v.number < 12 AND
   v.type = 'p'
)

SELECT 
    Ventas, 
    prd_descripcion,
    COALESCE(crt_fecinivige, DATENAME(MM, dt) + ' ' + CAST(YEAR(dt) AS VARCHAR(4))),
    prd_producto_id, 
    pnc_cantidad    
FROM cte c

LEFT JOIN (
    SELECT 
      COUNT(crt_numinterno_id) * 100.00 / pnc_cantidad AS Ventas,
      prd_descripcion, 
      DATENAME(MM, crt_fecinivige) + ' ' + CAST(YEAR(crt_fecinivige) AS VARCHAR(4)) AS crt_fecinivige, 
      C.prd_producto_id,
      pnc_cantidad 
    FROM Certificados C 
    INNER JOIN Penetracion P 
      ON C.ges_gestor_id = P.ges_gestor_id 
      AND C.spo_sponsor_id = P.spo_sponsor_id 
      AND C.prd_producto_id = P.prd_producto_id 
    LEFT JOIN Productos R 
      ON C.ges_gestor_id = R.ges_gestor_id 
      AND C.spo_sponsor_id = R.spo_sponsor_id 
      AND C.prd_producto_id = R.prd_producto_id 
    WHERE C.ges_gestor_id = @codGestor 
      AND C.spo_sponsor_id = @codSponsor 
      AND (@codProducto = '' OR @codProducto = C.prd_producto_id) 
      AND crt_fechabaja IS NULL 
      AND crt_fecinivige BETWEEN @fechaInicio AND @fechaFin 
    GROUP BY 
      pnc_cantidad,
      prd_descripcion,
      DATENAME(MM, crt_fecinivige),
      YEAR(crt_fecinivige), 
      DATEPART(yyyy,crt_fecinivige),
      C.prd_producto_id,
      DATEPART(m,crt_fecinivige) 
) a ON c.dt = a.crt_fecinivige
ORDER BY 
    DATEPART(yyyy,crt_fecinivige) DESC,
    DATEPART(m,crt_fecinivige) DESC