数据库中不存在甚至前几个月的前三个月

时间:2012-12-05 04:32:40

标签: sql

以下是我的新sql,因为我没有设法使用Dale M建议,

SELECT
all_months.a_month_id AS month,
year($P{date}) as year,
count(case when clixsteraccount.rem_joindate between DATE_FORMAT($P{date}-INTERVAL 2   MONTH, '%Y-%m-01') AND $P{date} THEN clixsteraccount.rem_registerbycn end) AS
total_activation,
'ACTIVATION(No)' AS fake_column

FROM clixsteraccount right join all_months on all_months.a_month_id = date_format(clixsteraccount.rem_joindate,'%m') and
(clixsteraccount.rem_registrationtype = 'Normal')and(clixsteraccount.rem_kapowstatus='pending' or clixsteraccount.rem_kapowstatus='success')

GROUP BY year,month

HAVING month BETWEEN month(date_sub($P{date},interval 2 month)) and month($P{date})

所以,我所做的是创建一个包含两个字段的表,a_month_id(1,2,3 ...,12)和a_month(月份名称)。上面的SQL确实给了我想要的东西,显示前3个月甚至前几个月都不存在。 exp:数据从7月开始。所以,我想显示5月,6月和7月的数据,如0,0,100。

问题发生在下个月或明年。当我尝试在Jan上基于参数生成sql时,它不像我想的那样工作。我确实意识到问题在于“有”条件。有没有人知道如何即兴创作这个sql,以便在下一年继续生成。

先谢谢你。

1 个答案:

答案 0 :(得分:0)

好的,我会提出一些建议并给你一个可以在SQL Server上运行的答案 - 你需要自己做任何翻译。

我注意到您的查询将汇总所有年份,即2012年12月+ 2013年12月+ 2014年12月等。根据您的问题,我不认为这是您的意图所以我会保持每个不同。如果这是您的意图,您可以更改查询。我还没有包括您的选择标准(除月份外)。

我建议您使用索引表。这是一个存储在您的数据库(或主数据库,如果可能)中的表,其中聚簇索引整数列从0到n运行,其中n是一个足够大的数字 - 10,000对于此应用程序来说已经足够了(有12个月的时间)一年如此10,000代表833年)。这个表非常有用,每个人都应该有一个。

SELECT  DATEADD(month, it.id, 0 ) AS month
    ,ISNULL(COUNT(clixsteraccount.rem_registerbycn), 0) AS registration
    ,'REGISTRATION(No)' AS fake_column
FROM    cn
    INNER JOIN ON ca.rem_registerbycn = cn.cn_id
    clixsteraccount ca 
    RIGHT JOIN
    IndexTable it ON it.id = DATEDIFF(month, 0, clixsteraccount.rem_joindate)
WHERE   it.id BETWEEN DATEDIFF(month, 0, @StartDate) - 3 AND DATEDIFF(month, 0, GETDATE())
GROUP BY it.id

它的工作方式是将clixsteraccount.rem_joindate转换为一个整数,该整数表示自日期0(SQL Server中的01-01-1900)以来的月数。然后将其与IndexTable的id列匹配,并受所选日期的限制。因为索引表中存在每个数字,并且我们使用外部联接,所以数据中缺少数月是无关紧要的。