0

以下は、Dale Mのアドバイスを使用できない限り、私の新しいSQLです。

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(月の名前) の 2 つのフィールドを持つテーブルを作成します。上記のSQLは、前の3か月が存在しない場合でも、前の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 で十分です (年なので、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 に答える