输出一年中每周间隔的某些列的总和,星期与日期一致

时间:2013-03-21 04:48:04

标签: sql coldfusion sum dayofweek

因为我被困住了,我需要一些帮助。这是使用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周的SUM。 我需要的报告是在顶部标题中显示月份,然后在该月的下一个标题中显示每周,然后基本上计算在该周完成的每张票。因此,周/月必须是专栏。

我已经阅读了一些CF功能和所有功能,但只是不确定如何利用它们来获得我需要的功能。 有没有办法动态调整这些日期,确保它们在基于周的正确列中是SUMMED,或者使用Coldfusion来处理这部分?但是我对ColdFusion部分也不太确定,所以如果可能的话,任何关于使用SQL或CF并且可能帮我解决代码部分的建议都会非常感激。

谢谢!

3 个答案:

答案 0 :(得分:0)

我建议创建一个主键是日期的数据库表。此表中的其他字段将包括周字符串(1月7日 - 13日)以及您需要的任何其他内容,假期,财务信息等。

您需要一些维护脚本来执行某些操作,您可能需要手动执行假期部分。这就是我们对数据仓库所做的工作。

它使您当前尝试的报告非常简单。

答案 1 :(得分: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 PK和{{1}的简单结构的表中}}

statsFrequency INTEGER UNSIGNED NOT NULL

然后,这将为您提供一个表格,其中包含前几天的标签,可以在不敲击主表的情况下查询(但是如果它是一张大/忙表并且在运行中生成它们将无法生效)

答案 2 :(得分:0)

我认为令你困惑的部分是MSSQL如何处理周数。它们都是周一至周的格式。本案例第1周从2012年12月31日星期一至2013年6月1日星期日开始(而不是2013年1月1日至2013年1月7日你假设),第2周:2013年1月7日至2013年1月13日,等等... 2013年2月18日是一年的第八周,因为它开始了第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年,该偏移将是 1天为2013年1月1日(人类年初) - 12/31/2012(sql年初)。这些日期将与您的[Jan1-7]周格式匹配。

希望这会有所帮助。 -Minh