0

以下是我的新 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 以使其在明年继续生成。

提前谢谢你。

4

1 回答 1

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 列匹配,并受您选择的日期的限制。因为每个数字都存在于索引表中,并且我们使用的是外连接,所以如果您的数据中缺少月份,则无关紧要。

于 2012-12-05T22:29:35.550 回答