2

我试图在 SQL Server 中汇总 FY13 的 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

请注意,由于 FY13 于 2012 年 10 月 1 日开始并于 2012 年 9 月 30 日结束,FY13 的第一周是 6 天而不是 7 天。

我正在使用 SQL Server 2008。

4

5 回答 5

2

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

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

注意:我使用DATEADD并减去 2 天,根据您的日期将一周的第一天设置为星期一。如果需要,您可以修改它。

于 2013-03-25T16:42:57.130 回答
2

将选项与GROUP BY ROLLUP运算符一起使用

SELECT CASE WHEN DATE IS NULL THEN 'Total' ELSE CONVERT(nvarchar(10), DATE, 101) END AS DATE,
       SUM(BREAD) AS BREAD, SUM(MILK) AS MILK
FROM dbo.test54
GROUP BY ROLLUP(DATE),(DATENAME(week, DATE))

SQLFiddle上的演示

结果:

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
于 2013-03-25T17:06:32.263 回答
0

上面的 WITH ROLLUP 建议可以提供帮助;您需要保存数据并根据需要进行转换。

您需要做的最重要的事情是正确识别您的周数。如果您还没有将它们加载到表中以便您可以识别它们,您可以即时构建它们。这是一种方法:

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)。您也可以根据需要即时构建它。

于 2013-03-25T16:44:09.583 回答
0

以下是如何完成的总体思路:

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

然后您可以 GROUP BY 该派生列并使用 SUM 聚合函数。

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

于 2013-03-25T16:17:34.030 回答
0

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

看一看:使用 ROLLUP 汇总数据

于 2013-03-25T16:16:22.720 回答