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],

如您所见,我基本上是在尝试获取完成日期是一年中的哪一周,并将其汇总在自己的列中。除非有人有更好的建议,否则它应该采用这种格式。例如,问题是 2013 年 2 月 18 日,SQL 告诉我这将是 2013 年的第 8 周,而我的代码将在 FEB15-21 中求和,根据我的代码,这是第 7 周。我需要的报告是在顶部标题中显示月份,然后在该月的下一个标题中显示每周,然后基本上计算该周完成的每张票。所以周/月需要是列。

我已经阅读了一些 CF 功能和所有内容,但只是不确定如何利用它们来获得我需要的东西。有没有办法动态求和这些日期,确保它们根据星期在正确的列中求和,或者使用 Coldfusion 来处理这部分?但我对 ColdFusion 部分也不太确定,所以如果可能的话,任何关于使用 SQL 或 CF 的建议以及可能在代码部分帮助我的任何建议都将非常感激。

谢谢!!

4

3 回答 3

0

I recommend creating a database table where the primary key is the date. Other fields in this table would include the week string (Jan 7 - 13) plus anything else, holidays, fiscal information, etc that you need.

You'll need a maintenance script for some things and you might have to do the holidays part manually. It's what we do with our data warehouse.

It makes the report you are currently attempting very simple.

于 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

希望这对您有所帮助,如果这不是您想到的那种事情,请澄清问题。

如果这是针对一个非常大的表并且您只对日终统计数据感兴趣,那么请考虑在每天之后将以下内容运行到一个具有简单结构的表中,其中包含列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 日到2013 年 1 月 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 子句和总和中使用它。

但是,为了匹配您的代码,您可以将偏移天数添加到 [Start Of Week] 和 [End Of Week] 以获得您的范围。在 2013 年,该偏移量将是1 天,即 2013 年 1 月 1 日(人类年初) - 2012 年 12 月 31 日(sql 年初)。这样,日期将全部与您的 [Jan1-7] 周格式相匹配。

希望这可以帮助。-明

于 2013-03-22T14:53:07.450 回答