1

立ち往生しているので、助けが必要です。これは SQL と Coldfusion を使用しています。基本的に、特定のチケットの完了と、完了とマークされた日付をリストする表があります。このテーブルには、たとえば、GROUP BY で使用される地区とエリアがあります。したがって、その年の毎週行われたすべてのチケットをカウントしたいのですが、ユーザーはレポートの実行などを選択します。現時点で持っている SQL を少しリストします。

 SELECT                                           
    SUM(CASE WHEN DATEPART(ww, completionDate) = 1 THEN 1 ELSE 0 END) AS [Jan1-7],
    SUM(CASE WHEN DATEPART(ww, completionDate) = 2 THEN 1 ELSE 0 END) AS [Jan8-14],
    SUM(CASE WHEN DATEPART(ww, completionDate) = 3 THEN 1 ELSE 0 END) AS [Jan15-21],
    SUM(CASE WHEN DATEPART(ww, completionDate) = 4 THEN 1 ELSE 0 END) AS [Jan22-31]    
    SUM(CASE WHEN DATEPART(ww, completionDate) = 5 THEN 1 ELSE 0 END) AS [Feb1-7],
    SUM(CASE WHEN DATEPART(ww, completionDate) = 6 THEN 1 ELSE 0 END) AS [Feb8-14],
    SUM(CASE WHEN DATEPART(ww, completionDate) = 7 THEN 1 ELSE 0 END) AS [Feb15-21],
    SUM(CASE WHEN DATEPART(ww, completionDate) = 8 THEN 1 ELSE 0 END) AS [Feb22-28],

ご覧のとおり、私は基本的に、completionDate が年のどの週であったかを取得し、それを独自の列に合計しようとしています。誰かがより良い提案を持っていない限り、この形式にする必要があります。たとえば、問題は 2013 年 2 月 18 日です。SQL は 2013 年の 8 週目であると言っていますが、私のコードでは 2 月 15 日から 21 日で合計されます。これは私のコードによると 7 週目です。必要なレポートは、上部のヘッダーに月を表示し、その月の次のヘッダーに毎週表示し、基本的にその週に完了したすべてのチケットをカウントすることです。したがって、週/月は列である必要があります。

いくつかの CF 関数とすべてを読みましたが、それらを利用して必要なものを取得する方法がわかりません。これらの日付を動的に合計して、週に基づいて正しい列に合計されるようにする方法、または Coldfusion を使用してこの部分を処理する方法はありますか? しかし、ColdFusion の部分についてもよくわからないので、可能であれば、SQL または CF の使用に関する提案や、コードの部分で私を助けてくれることを本当に感謝しています。

ありがとう!!

4

3 に答える 3

0

主キーが日付であるデータベーステーブルを作成することをお勧めします。このテーブルの他のフィールドには、週の文字列(1月7日から13日)に加えて、必要なその他の情報、休日、会計情報などが含まれます。

いくつかのメンテナンススクリプトが必要になり、休日の部分を手動で行う必要がある場合があります。これが、データウェアハウスで行うことです。

これにより、現在試行しているレポートが非常に簡単になります。

于 2013-03-21T12:03:29.987 に答える
0

私が正しくフォローしていると100%確信しているわけではありませんが、このクエリを試してみませんか. これにより、週/月の組み合わせごとに頻度がカウントされ、出力時に必要に応じて週または月ごとに分割できます。その後、CF ロジックを使用して、出力用の制限日を決定できます。

SELECT

    -- Get the week and month of each row
    MONTH(completionDate) AS monthOfYear,
    WEEK(completionDate) AS weekOfYear,

    -- Count how many rows are in this group
    COUNT(*) AS frequency

FROM yourTable AS yt

-- If you are only interested in a specific date range, chuck in something like this
WHERE yt.completionDate BETWEEN DATE('2013-01-01') AND ('2013-12-30')

-- Order by month and then week, so that week 4 in Jan comes before week 4 in Feb
GROUP BY
    monthOfYear ASC,
    weekOfYear ASC

これが役に立てば幸いです。これがあなたが考えていたようなものではない場合は、質問を明確にしてください。

これが非常に大きなテーブルで、1 日の終わりの統計だけに関心がある場合は、毎日の後に次のようなものを実行して、列statsDate DATE NOT NULL PKstatsFrequency INTEGER UNSIGNED NOT NULL

INSERT INTO yourStatsTable(
    statsDate,
    statsFrequency
)
SELECT
    DATE(completionDate),
    COUNT(*)
FROM yourTable AS yt
WHERE yt.completionDate >= SUBDATE(CURRENT_DATE,1) 
AND yt.completionDate < CURRENT_DATE
ON DUPLICATE KEY UPDATE statsFrequency = VALUES(statsFrequency)

これにより、メインテーブルにアクセスせずにクエリできる前日の集計を含むテーブルが得られます (ただし、これは、大きな/ビジーなテーブルであり、その場でそれらを生成できない場合にのみ実行してください)。

于 2013-03-22T11:25:38.367 に答える
0

あなたを混乱させているのは、MSSQL が週番号をどのように扱っているかだと思います。それらはすべて月曜から日曜の週の形式です。この場合の第 1 週は、2012 年 12 月 31 日月曜日から 2013 年 1 月 6 日日曜日に始まります (2013 年 1 月 1 日から 2013 年 1 月 7 日ではありません)。第 2 週: 2013 年 1 月 7 日から1/13/13 など... 2013 年 2 月 18 日は、年の第 8 週 (月曜日) から始まるため、第 8 週になります。

次のようなものを使用する必要があります。

DATEADD(ww, DATEDIFF(ww,0,completionDate), 0) AS [Start Of Week],
DATEADD(s,-1,DATEADD(ww, DATEDIFF(ww,0,GETDATE())+1,0)) as [End Of Week]

開始日と終了日を取得し、group by 句と合計で使用します。

ただし、コードに一致させるために、オフセット日数を [週の開始] と [週の終了] に追加して、範囲を取得できます。2013 年のオフセットは、2013 年1 月 1 日(人間による年始) - 2012 年 12 月 31 日 (SQL 年始) の 1 日になります。日付はすべて [Jan1-7] の週の形式と一致します。

お役に立てれば。-ミン

于 2013-03-22T14:53:07.450 に答える