2015-12-28 126 views
0

我希望通过本周从给定的起始日期为不确定的未来汇总数据。通常我只想转储设置到Excel仪表板和组那里通过枢轴等结果,但我在写这个查询移交给一组用户,并允许他们通过前端BI应用程序的访问,所以我想尽可能完整地给予他们。tSQL根据日期字段按星期汇总数据?

我目前的方法显然是低效率的,所以我很想找到一个简单的公式来做到这一点(或一种方式来创建一个可变的一周削减所有的重复脚本)。我曾考虑过使用DATEADD,但尚未能使其工作。

我目前的解决方案的例子如下:

SELECT 
    'Week Ending' = (CASE 
         WHEN YEAR(duedate) = '2015' 
          THEN (CASE 
            WHEN datepart(wk, duedate) = 32 THEN '2015/08/07' 
            WHEN datepart(wk, duedate) = 33 THEN '2015/08/14' 
            WHEN datepart(wk, duedate) = 34 THEN '2015/08/21' 
            WHEN datepart(wk, duedate) = 35 THEN '2015/08/28' 
            WHEN datepart(wk, duedate) = 36 THEN '2015/09/04' 
            WHEN datepart(wk, duedate) = 37 THEN '2015/09/11' 
            WHEN datepart(wk, duedate) = 38 THEN '2015/09/18' 
            WHEN datepart(wk, duedate) = 39 THEN '2015/09/25' 
            WHEN datepart(wk, duedate) = 40 THEN '2015/10/02' 
            WHEN datepart(wk, duedate) = 41 THEN '2015/10/09' 
            WHEN datepart(wk, duedate) = 42 THEN '2015/10/16' 
            WHEN datepart(wk, duedate) = 43 THEN '2015/10/23' 
            WHEN datepart(wk, duedate) = 44 THEN '2015/10/30' 
            WHEN datepart(wk, duedate) = 45 THEN '2015/11/06' 
            WHEN datepart(wk, duedate) = 46 THEN '2015/11/13' 
            WHEN datepart(wk, duedate) = 47 THEN '2015/11/20' 
            WHEN datepart(wk, duedate) = 48 THEN '2015/11/27' 
            WHEN datepart(wk, duedate) = 49 THEN '2015/12/04' 
            WHEN datepart(wk, duedate) = 50 THEN '2015/12/11' 
            WHEN datepart(wk, duedate) = 51 THEN '2015/12/18' 
            WHEN datepart(wk, duedate) = 52 THEN '2015/12/25' 
            WHEN datepart(wk, duedate) = 53 THEN '2016/01/01' 
           END) 
         WHEN YEAR(duedate) = '2016' 
          THEN (CASE 
            WHEN datepart(wk, duedate) = 1 THEN '2016/01/01' 
            WHEN datepart(wk, duedate) = 2 THEN '2016/01/08' 
            WHEN datepart(wk, duedate) = 3 THEN '2016/01/15' 
            WHEN datepart(wk, duedate) = 4 THEN '2016/01/22' 
           END) 
        END), 
    SUM(linetotal) 
FROM 
    PurchaseOrderDetail 
WHERE 
    YEAR(duedate) > '2014' 
GROUP BY 
    YEAR(duedate), DATEPART(wk, duedate) 

我想答案很简单,但我一直没能找到完全是我正在找呢。

+0

[如何让周和SQL Server 2008的周最后一天的第一天?(HTTP的可能重复://计算器.COM /问题/ 21330671 /如何对获得-首日的最周和最后一天的星期几,在-SQL服务器2008年) –

回答

0

像这样的东西会给你同样的输出,而不需要手动指定每个星期结束日期:

SELECT 
convert(varchar, duedate - datepart(dw, duedate) + 6, 111) as [Week Ending], 
sum(linetotal) 

FROM 
PurchaseOrderDetail 

WHERE 
year(duedate) > '2014' 

GROUP BY 
year(duedate), convert(varchar, duedate - datepart(dw, duedate) + 6, 111) 

转换为VARCHAR(样式111)是不是绝对必要的,但它会给在您的原始案例陈述中使用了相同的“YYYY/MM/DD”格式。你可以很容易地使用duedate - datepart(dw, duedate) + 6没有转换功能,将输出相同的值,但使用相同的日期时间/ DATETIME2/smalldatetime的格式作为输入(可能是“YYYY-MM-DD HH:MM:SS”)。

0

考虑沿着这些路线的解决方案(请注意 - 该代码是未经测试的,因为我没有访问SQL Server实例现在)。这个想法是用年份和星期数来代替(硬编码)日期。这个建议的解决方案将允许您的BI用户按年份和星期编号查看linetotal的总和。当你获得更多的数据,用户甚至可以通过一年(linetotal于2014年,2015年,2016年,..)比较每周linetotal

SELECT 
    YEAR(duedate) AS Year1, datepart(wk, duedate), SUM(linetotal) 
FROM 
    PurchaseOrderDetail 
WHERE 
    YEAR(duedate) > '2014' 
GROUP BY 
    YEAR(duedate), DATEPART(wk, duedate) 
0

你正在寻找的功能可能是这样的:

SELECT 
    'Week Ending' = dateadd(wk, 
          datepart(wk,duedate)-1, 
          DATEADD(DAY, 
            6 - DATEPART(WEEKDAY, DATEADD(YEAR, year(duedate) - 1900, 0)), 
            DATEADD(YEAR, year(duedate) - 1900, 0))) 
相关问题