Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在SQL中聚合7天_Sql_Sql Server_Sql Server 2008 - Fatal编程技术网

如何在SQL中聚合7天

如何在SQL中聚合7天,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我试图在SQL Server中聚合2013财年的7天数据(从2012年10月1日开始,到2013年9月30日结束),但到目前为止还没有成功。谁能看一下吗。下面是我的示例数据 DATE BREAD MILK 10/1/12 1 3 10/2/12 2 4 10/3/12 2 3 10/4/12 0 4 10/5/12 4 0 10/6/12 2 1 10

我试图在SQL Server中聚合2013财年的7天数据(从2012年10月1日开始,到2013年9月30日结束),但到目前为止还没有成功。谁能看一下吗。下面是我的示例数据

DATE       BREAD    MILK    
10/1/12    1        3
10/2/12    2        4
10/3/12    2        3
10/4/12    0        4
10/5/12    4        0
10/6/12    2        1
10/7/12    1        3
10/8/12    2        4
10/9/12    2        3
10/10/12   0        4
10/11/12   4        0
10/12/12   2        1
10/13/12   2        1
因此,我期望的输出如下:

DATE       BREAD    MILK
10/1/12    1        3
10/2/12    2        4
10/3/12    2        3
10/4/12    0        4
10/5/12    4        0
10/6/12    2        1
Total      11       15
10/7/12    1        3
10/8/12    2        4
10/9/12    2        3
10/10/12   0        4
10/11/12   4        0
10/12/12   2        1
10/13/12   2        1
Total      13       16

--------through 9/30/2013
请注意,由于2013财年开始于2012年1月10日,结束于2012年9月30日,因此2013财年的第一周为6天,而非7天


我正在使用SQL server 2008。

您正在寻找汇总。在这种情况下,您将需要至少有一个列作为分组依据来进行汇总,最简单的方法是添加一个计算列,将它们按日期分组为周


看一看:

以下是如何实现这一目标的总体思路:

您需要为每行指定一个派生列,以确定该记录属于哪个会计周。一般来说,您可以从10/1中减去该记录的日期,得到经过的天数,除以7,然后计算结果

然后,您可以按该派生列进行分组,并使用SUM aggregate函数


最大的问题是你开始每周工作6天。您可能需要添加一些逻辑,以确保周从周日或您使用的任何一天开始,但这应该可以让您开始。

您可以为日期值添加一个新的计算列,以按周对它们进行分组,并对其他列求和,类似于以下内容:

SELECT DATEPART(ww, DATEADD(d,-2,[DATE])) AS WEEK_NO, 
       SUM(Bread) AS Bread_Total, SUM(Milk) as Milk_Total
FROM YOUR_TABLE
GROUP BY DATEPART(ww, DATEADD(d,-2,[DATE]))

注意:我使用
日期添加
并减去2天,根据日期将一周的第一天设置为周一。如果需要,您可以对此进行修改。

上面的汇总建议会有所帮助;您需要保存数据并根据需要进行转换

你需要做的最重要的事情就是正确地确定你的周数。如果您还没有将它们加载到表中以便识别它们,那么您可以动态地构建它们。有一种方法可以做到这一点:

CREATE TABLE #fy (fyear int, fstart datetime, fend datetime);
CREATE TABLE #fylist(fyyear int, fydate DATETIME, fyweek int);

INSERT INTO #fy
SELECT 2012, '2011-10-01', '2012-09-30'
UNION ALL
SELECT 2013, '2012-10-01', '2013-09-30';

INSERT INTO #fylist
        ( fyyear, fydate )

SELECT fyear, DATEADD(DAY, Number, DATEADD(DAY, -1, fy.fstart)) AS fydate
FROM Common.NUMBERS
CROSS APPLY (SELECT * FROM #fy WHERE fyear = 2013) fy
WHERE fy.fend >= DATEADD(DAY, Number, DATEADD(DAY, -1, fy.fstart));

WITH weekcalc AS
(
    SELECT DISTINCT DATEPART(YEAR, fydate) yr, DATEPART(week, fydate) dt
    FROM #fylist

),
    ridcalc AS
(
    SELECT 
    ROW_NUMBER() OVER (ORDER BY yr, dt) AS rid, yr, dt
    FROM weekcalc
)   

UPDATE #fylist
SET fyweek = rid
FROM #fylist
JOIN ridcalc
    ON DATEPART(YEAR, fydate) = yr
    AND DATEPART(week, fydate) = dt;



 SELECT list.fyyear, list.fyweek, p.[date], COUNT(bread) AS Bread, COUNT(Milk) AS Milk
 FROM products p
 JOIN #fylist list 
    ON p.[date] = list.fydate
 GROUP BY list.fyyear, list.fyweek, p.[date] WITH ROLLUP;
上面的
Common.Numbers
参考是一个简单的数字表,我用于这类事情(从1到1M)。您还可以根据需要动态构建它。

将选项与operator一起使用

演示

结果:

DATE        BREAD   MILK
10/01/2012  1       3
10/02/2012  2       4
10/03/2012  2       3
10/04/2012  0       4
10/05/2012  4       0
10/06/2012  2       1
Total       11      15
10/07/2012  1       3
10/08/2012  4       7
10/10/2012  0       4
10/11/2012  4       0
10/12/2012  2       1
10/13/2012  2       1
Total       13      16

只需创建一个
week
列,并使用窗口函数对
bread
milk
按周划分的
进行求和。是否有包含会计日期信息的日历表?那应该有必要的
week
列,剩下的应该很简单。不,我没有。谢谢,多谢,也谢谢其他的绅士。它工作得很好。再次感谢。@joe仅供参考,如果您的数据在某些年份(如2012年、2013年等),则需要此分组依据子句:分组依据汇总(日期),(日期名称(年、日期)),(日期名称(周、日期))
DATE        BREAD   MILK
10/01/2012  1       3
10/02/2012  2       4
10/03/2012  2       3
10/04/2012  0       4
10/05/2012  4       0
10/06/2012  2       1
Total       11      15
10/07/2012  1       3
10/08/2012  4       7
10/10/2012  0       4
10/11/2012  4       0
10/12/2012  2       1
10/13/2012  2       1
Total       13      16