microsoft sql为连接中的每一行创建日期

时间:2014-09-08 17:18:12

标签: sql date join

我需要查询每个客户的趋势。由于并非所有客户每月都会购买一些东西,因此有一个月我没有获得该客户的数据,但我仍然需要将该月份视为零。

我想在每个月创建一个表格,我希望看到:

select DISTINCT CONVERT(VARCHAR(10),DATEADD(dd,-(DAY(loaddate)-1),loaddate),126) AS meses
into dbo.gp_MESES
FROM CustomerDebits AS D WITH (NOLOCK)
WHERE LOADDATE>='20130101' AND LOADDATE<=GETDATE() 
ORDER BY 1;

和lef在每个月购买每个客户的情况。

SELECT CODEMP, CONVERT(VARCHAR(10),DATEADD(dd,-(DAY(loaddate)-1),loaddate),126) AS FECHA_MES, 
COUNT(*) AS Q_CLIENTES
INTO DBO.GP_TEND_0
FROM  CustomerDebits AS D WITH (NOLOCK)
WHERE LOADDATE<=GETDATE() AND LOADDATE>='20130101'
GROUP BY CODEMP, CONVERT(VARCHAR(10),DATEADD(dd,-(DAY(loaddate)-1),loaddate),126);

问题在于,当顾客没有做任何事情时,我仍然没有看到0行。我正在考虑用每个客户组合创建一个表 - 几个月之后加入,但效率不高。

你知道我怎么解决这个问题?

谢谢!

1 个答案:

答案 0 :(得分:0)

你应该能够在meses = FECHA_MES上将DBB.GP_TEND_0全部外连接dbo.gp_MESES表并利用NULL来获得你正在寻找的零值。

我设想这样的事情:

    SELECT COALESCE(T2.FECHA_MES, T1.MESES) AS MONTH --THIS WILL PULL MESES WHERE FECHA_MES IS NULL
    ,T2.CODEMP
    ,ISNULL(T2.Q_CLIENTES, 0) AS PURCHASES --THIS WILL GIVE YOU 0 WHERE Q_CLIENTES IS NULL
   FROM dbo.gp_MESES T1
   FULL OUTER JOIN DBO.GP_TEND_0 T2 
   ON T1.MESES = T2.FECHA_MES