2011-05-09 196 views
0

我需要找到该特定客户的最大日期,这将被视为最新日期(或当前日期)。然后,从那里我需要回去52周到27周,并计算总和(小时)。和26周至最近日期(或当前日期)并计算总和(小时)。计算每周基数的小时数?

ClientID StoreID period  hours 
    1  10  2010-04-19 8.04 
    1  10  2010-04-20 6.24 
    1  10  2010-04-21 8.26 
    1  20  2010-04-22 7.94 
    1  20  2010-04-23 22.43 
    1  20  2010-04-24 22.99 
    2  5  2010-12-19 130.67 
    2  5  2010-12-26 159.26 
    2  5  2011-01-02 113.59 
    2  5  2011-01-09 12.66 
    2  8  2011-01-16 22.34 
    2  8  2011-01-23 11.35 

请让我知道如何在SQL中计算以获得输出?如果你有问题问我。

+2

你有什么试过的?到目前为止,你有什么?你在寻找一个概念“如何实现这个”或实际的代码? – 2011-05-09 14:21:08

+0

我正在查找代码。 – James123 2011-05-09 14:34:05

+0

好的,根据你提供的样本数据,你会得到什么输出? – 2011-05-09 14:37:45

回答

2

为此仅使用两个查询是最简单的;第一个获得边界日期,第二个计算总数。你可以把它全部转换成一个查询,但我认为它不会有很大的不同。

DECLARE 
    @BeginDate datetime, 
    @MidDate datetime 

SELECT 
    @BeginDate = DATEADD(wk, -52, MAX(period)), 
    @MidDate = DATEADD(wk, -25, MAX(period)) 
FROM TableName 
WHERE ClientID = @ClientID 

SELECT 
    SUM(CASE 
      WHEN period >= @BeginDate AND period < @MidDate THEN hours 
      ELSE 0 
     END) AS HoursInFirstHalf, 
    SUM(CASE 
      WHEN period >= @MidDate THEN hours 
      ELSE 0 
     END) AS HoursInLastHalf 
FROM TableName 
WHERE ClientID = @ClientID 
+0

我可能是错的,但从我读过的问题来看,OP很可能会为每个客户都要这样做。否则,我认为你的方法非常整齐。 (只有它应该是'27'而不是'25')。我可能会将第一个SELECT转换为一个将被连接回原始表的子查询。 – 2011-05-09 21:01:03

+0

@Andriy:问题说*“对于那个特定的客户”*。这与“为每个客户”完全相反。如果这就是OP的真正含义,那么他错误地说明了这个问题。你对周计数也不正确。 OP从* begin *日起27周,这是从* end *日期减去25周,这是相同的事情。最后,正如我所说的,你可以用一个子查询将其转换为一个查询,但是我认为这样做没有好处,它只会使查询的可读性降低(也许如果这是一个内联TVF,它将会很重要)。 – Aaronaught 2011-05-09 21:23:17

+0

在我看来,使用CTE不会降低脚本的可读性,尽管我知道我们无法确定OP的服务器版本是否为2005或更高版本。无论如何,我只是在修改解决方案以便为所有客户端返回数据的情况下转变为子选择。如果你留在单一客户端解决方案中,那么我同意,将第一个选择转换为子查询没有太大的收获。 – 2011-05-09 22:43:51