2015-02-05 46 views
0

我有一个SQL查询计算两个总和的报价。此报价应按周计算。因此使用Datepart('ww', Date, 2, 2)来获取日历周。查询按日历周分组/问题:日期扩展超过一年

这个查询在2014年工作正常,但现在我面临一个问题。

该用户的动产与和日期的形式日期选取器,然后在where子句中使用,只选择相关记录。

如果他们选择了从过去的一年中(例如2014)日期和最新从今年我的查询显示irrelvant数据,因为它不cosinder今年刚刚日历周。

那么,如何通过日历周组,只选择从正确的年份记录。

SELECT DatePart('ww',Date,2,2) AS WEEK, 
    Year(Workload_Date) AS [YEAR], 
    (SUM(Value1)+SUM(Value2))AS [Total1], 
    (SUM(Value3)+SUM(Value4)) AS [Total2], 
    ((SUM(Value1)+SUM(Value2))/(SUM(Value3)+SUM(Value4))) AS [Quote] 
FROM tbl 
WHERE DatePart('ww',Date,2,2) Between DatePart('ww',FromDatePickerField,2,2) And DatePart('ww',ToDatePickerField,2,2) 
GROUP BY DatePart('ww',Date,2,2), Year(Date) 
ORDER BY Year(Date), DatePart('ww',Date,2,2); 

该表格每天包含一条记录。

Date  | Value1 | Value2 | Value3 | Value4 | 
01.01.2014 | 4  | 3  | 2  | 3  | 
02.01.2014 | 4  | 3  | 9  | 3  | 
03.01.2014 | 4  | 3  | 4  | 1  | 
04.01.2014 | 4  | 3  | 1  | 3  | 
... 
01.01.2015 | 4  | 3  | 6  | 3  | 
02.01.2015 | 4  | 3  | 3  | 7  | 

回答

1

你可以你的基础上的逻辑Week_Ending_date而不是周数和年份,这样你可汇总每周你的数据,让SQL处理周/年的检测逻辑。

柜面,你必须跨越2年的日期范围,即使再计算将基于对week_ending_date和应能正常工作了。

喜欢的东西...

SELECT DATEADD(dd, 7-(DATEPART(dw, DATE)), DATE) AS WEEK_ENDING_DATE 
     ,Year(DATEADD(dd, 7-(DATEPART(dw, DATE)), DATE)) AS [YEAR] 
     ,(SUM(Value1) + SUM(Value2)) AS [Total1] 
     ,(SUM(Value3) + SUM(Value4)) AS [Total2] 
     ,((SUM(Value1) + SUM(Value2))/(SUM(Value3) + SUM(Value4))) AS [Quote] 
    FROM tbl 
    WHERE DATEADD(dd, 7-(DATEPART(dw, DATE)), DATE) BETWEEN DATEADD(dd, 7-(DATEPART(dw, FromDatePickerField)), FromDatePickerField) 
      AND DATEADD(dd, 7-(DATEPART(dw, ToDatePickerField)), ToDatePickerField) 
and date >= FromDatePickerField 
and date <= ToDatePickerField 
    GROUP BY DATEADD(dd, 7-(DATEPART(dw, DATE)), DATE)  
    ORDER BY DATEADD(dd, 7-(DATEPART(dw, DATE)), DATE) 
+0

感谢您的答复。我还没有完全理解这个逻辑。比方说,用户选择从星期三开始。此查询是否会从星期一开始选择所有记录?与迄今为止一样的东西。用户再次选择星期三,将记录直到星期天被选中? – blckbird 2015-02-05 15:40:27

+1

你说得对。您可以限制这些情况下的数据虽然..尝试更新的代码。 – SoulTrain 2015-02-05 15:44:49

+0

在dateadd和datepart中由于'dw'和'dd'出现错误。需要将'dw'改为''w''和'dd'为''d'' – blckbird 2015-02-05 16:05:23

0

我看到2个可能的解决方案。

1)您在使用窗体上的日期选择器每当年两个datepickers的不同停止用户。也许一个MsgBox什么的,

2)您更改到的DatePicker到从年。

DECLARE @MinDate DATE = '01.11.2014' 
DECLARE @tmpDate DATE = '12.02.2015' 
DECLARE @MaxDate DATE = (CASE WHEN Year(@MinDate) != Year(@tmpDate) THEN Convert(DATE, '31.12.' + Convert(VARCHAR(4), Year(@MinDate))) ELSE @tmpDate END) 

SELECT @MinDate, @tmpDate, @MaxDate 

结果:

minDate  tmpDate  maxDate 
01.11.2014 12.02.2015 31.12.2014 
+0

如果我做1,仍然有问题。如果从现在开始到2015年,则选择2014年以来具有相同日历周的记录。 – blckbird 2015-02-05 15:42:39

+0

如何将where子句更改为 'where date> = datepicker1'? – Hockenberry 2015-02-05 15:45:53

+0

比方说,用户选择从星期三开始。然后我会错过星期一和星期二的记录。迄今为止,反之亦然。 – blckbird 2015-02-05 15:47:47