在整个一年的周间隔一些列的输出和值,一周日期与当天一致(Output Sum of some col

2019-10-17 20:38发布

我需要一些帮助,因为我卡住了。 这是使用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周,而我的代码将在该FEB15-21,这是第7周,根据我的代码总和。 我需要的报告,显示当月顶部标题,然后每星期显示当月的下一个标题,然后基本上做到每票在上周完成的计数。 所以周/数月必须列。

我看过一些CF功能和所有的,只是不知道如何利用它们来得到我需要什么。 有两种办法来动态SUM这些日期确保他们在正确的列总结基础上,每周或用ColdFusion处理这部分? 但我不是在ColdFusion的部分也肯定不是,所以如果可能的话,无论是在使用SQL或CF,也许任何建议,帮助我的代码部分将真的很感激。

谢谢!!

Answer 1:

我建议创建一个数据库表,其中的主键是日期。 此表中的其他字段将包括一周字符串(1月7日至13日),加上别的,节假日,财政信息,等你需要的。

你需要对一些事物的维护脚本,你可能必须做手工假期的一部分。 这是我们做我们的数据仓库。

它使您目前正在尝试非常简单的报告。



Answer 2:

我不是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)

那么这会给你与前几天吻合,可以没有击中主表进行查询(但也只做到这一点,如果它是一个很大的忙/闲表和动态生成它们不会是可行的)表



Answer 3:

我认为这混淆你的部分是MSSQL是如何治疗的周数。 他们都是周一至周日周格式。 在这种情况下,第1周的星期一2012年12月31日开始至周日13年1月6日( 而不是2013年1月1日至2013年1月7日你假设 ),第2周:13年1月7日至13年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]

得到的开始和结束日期,并通过条款和求和使用它你的小组。

为了满足你的代码,但是,你可以抵消天数添加到[开始周]和[结束的Week]让你的范围。 在2013年,该偏移量为1一天 ,2013年1月1日(年的人开始) - 2012年12月31日(年的SQL开始)。 日期将所有符合了您的[Jan1-7]本周格式的方式。

希望这可以帮助。 -Minh



文章来源: Output Sum of some column in week intervals throughout a year, week dates consistent with day