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

Sql 以一年中的周间隔输出某些列的总和,周日期与日一致,sql,coldfusion,sum,dayofweek,Sql,Coldfusion,Sum,Dayofweek,我陷入困境,需要一些帮助。这是使用SQL和Coldfusion。 基本上,我有一个表格,列出了某些票的完成情况以及它们被标记为完成的日期。例如,此表包含“地区”和“面积”,在“分组依据”中使用。因此,我想计算一年中每个星期所做的每一张票证,用户选择例如运行报告。 我将列出我目前拥有的一些SQL SELECT SUM(CASE WHEN DATEPART(ww, completionDate) = 1

我陷入困境,需要一些帮助。这是使用SQL和Coldfusion。 基本上,我有一个表格,列出了某些票的完成情况以及它们被标记为完成的日期。例如,此表包含“地区”和“面积”,在“分组依据”中使用。因此,我想计算一年中每个星期所做的每一张票证,用户选择例如运行报告。 我将列出我目前拥有的一些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周,而我的代码将在2月15-21日对其进行汇总,根据我的代码,这是第7周。 我需要的报告是在顶部标题中显示该月,然后在该月的下一个标题中显示每周,然后基本上对该周完成的每张票进行计数。因此,周/月需要是列

我读过一些CF函数和所有函数,但不知道如何利用它们来获得我所需要的。 是否有一种方法可以动态地对这些日期求和,以确保它们在基于周的正确列中求和,或者使用Coldfusion来处理这一部分?但是我对ColdFusion部分也不是很确定,所以如果可能的话,任何关于使用SQL或CF的建议,以及可能在代码部分帮助我的建议都将非常感谢


谢谢

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

对于某些事情,您需要一个维护脚本,并且可能需要手动执行假期部分。这就是我们对数据仓库所做的


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

我不能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
希望这能有所帮助,如果这不是你想要的,请澄清这个问题

如果这是一个非常大的表,而你只关心一天的统计数据,那么就考虑在每天之后运行一个类似的东西到一个具有简单结构的表中,其中列StasDeDATE日期不是空PK和StistFuffic整数unSaleNULL <0/P>


然后,这将为您提供一个包含前几天计数的表,可以在不点击主表的情况下查询该表,但仅当该表很大/很忙时才执行此操作,并且动态生成它们是不可行的

我认为让您困惑的部分是MSSQL如何处理周数。它们都是周一到周日的格式。在这种情况下,第1周从2012年12月31日星期一开始到2013年6月1日星期日,而不是您假设的2013年1月1日到2013年7月1日,第2周:2013年7月1日到2013年13月1日,依此类推。。。2013年2月18日是一年中的第八周,因为它从周一开始的第八周开始

您将需要使用以下内容:

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]
获取开始和结束日期,并在分组中按子句和求和使用

不过,为了匹配您的代码,您可以将偏移天数添加到[周初]和[周末]以获得您的范围。2013年,该补偿将为1天,即2013年1月1日人类开始的年份-2012年12月31日sql开始的年份。通过这种方式,所有日期都将与您的[1-7]周格式相匹配


希望这有帮助-Minh

请参阅的答案。这个答案是基于按月收集日期,但它很容易适应周、天或小时等。1月22日至31日怎么可能是一周,它是9天……为什么你的周不是实际的周?我发现在日期间隔中使用它是可以的。不必考虑周/日。因此,将1-7..8-14..15-21和22保留到该月的最后一天是可以的。谢谢大家的帮助和回复。
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]