2013-03-28 41 views
0

我有这样集团按日期和时间并连续日期

date1  Price Availability ServiceID 
2012-10-01 50  1    5 
2012-10-02 60  1    5 
2012-10-03 60  1    5 
2012-10-04 60  1    5 
2012-10-06 60  1    5 
2012-10-07 60  0    5 
2012-10-08 60  1    5 

一组数据,现在,我要检查什么是总价格,最小的可用性和服务ID为某一特定时期

例如

from 2012-10-01 to 2012-10-03 results would be 170, availability 1 and serviceID 5 
from 2012-10-06 to 2012-10-08 results would be 180, availability 0! and serviceID 5 
from 2012-10-04 to 2012-10-06 results would be 120, availability 1! and serviceID 5 BUT there is a date missing so availability is 0! 

我想是这样

select date1, sum(price), min(availability), service from #t 
group by date1, price, availability, service 
having count(date1) = datediff(day, @startdate, @enddate) 

这不起作用,因为如果我按date1进行分组,则计数无效。不知道如何获得总和,最小可用性和检查连续日期。

编辑 如果我想要一个结果集包含详细的规格。并过滤掉与分钟(可用性)= 0或不连续的日期结果

For example 
from 2012-10-01 to 2012-10-03 results would be 170, availability 1 and serviceID 5 

date1  Price Availability ServiceID 
    2012-10-01 50  1    5 
    2012-10-02 60  1    5 
    2012-10-03 60  1    5 

from 2012-10-06 to 2012-10-08 results would be 180, availability 0! and serviceID 5 
date1  Price Availability ServiceID 

from 2012-10-04 to 2012-10-06 results would be 120, availability 1! and serviceID 5 BUT 
date1  Price Availability ServiceID 
+0

从2012-10-04到2012-10-06可能会有180个结果,如果每个有60个值有2个值?缺少日期需要“假”60吗? –

+0

@NenadZivkovic错字 – mko

回答

2

尝试这种情况:

select sum(price) As TotalPrice, 
     service, 
     Case When Count(*) = DateDiff(Day, @Startdate, @EndDate) + 1 
       Then Min(Availability) 
       Else 0 End As Availability 
from #T 
Where Date1 >= @StartDate 
     And Date1 <= @endDate 
group by service 

通过基于日期的where子句中过滤所述日期,而不是由日期分组,这可以让你获得一个或几行,然后你可以匹配日期差异。请注意,您需要将1添加到日期差异中,因为从昨天到今天的DateDiff仅为1,但会在源数据中表示2行。

我还应该提到,这实际上并没有检查连续日期。它只是寻找相应的行数以匹配计算的天数。

根据你的评论和你的编辑,你可能想尝试这个派生表解决方案。

Select T.date1, 
     SummaryData.TotalPrice, 
     SummaryData.Availability, 
     T.Service 
From #T T 
     Inner Join (
      select sum(price) As TotalPrice, 
      service, 
       Case When Count(*) = DateDiff(Day, @Startdate, @EndDate) + 1 
        Then Min(Availability) 
        Else 0 End As Availability 
      from #T 
      Where Date1 >= @StartDate 
        And Date1 <= @endDate 
      group by service 
      Having Case When Count(*) = DateDiff(Day, @Startdate, @EndDate) + 1 
         Then Min(Availability) 
         Else 0 End = 1 
      ) As SummaryData 
      On T.Service = SummaryData.Service 
Where Date1 >= @StartDate 
     And Date1 <= @endDate 
+0

基本上我需要一个cte或临时表。它不能在一个查询中解决? – mko

+0

@G马斯特罗斯你可以检查编辑我的问题的一部分? – mko

+0

可以在不使用CTE的情况下创建与上面显示的输出相同的输出,但可能无法在不使用CTE的情况下包含详细信息,除非您使用的是更新版本的SQL Server。你使用什么版本? –

0

如果有不适合的弧线球失踪日期,查询将是相当简单:

SELECT SUM(price), MIN(availability) AS Availibility, MIN(serviceID) AS serviceID FROM #t 
WHERE date1 BETWEEN @Startdate AND @enddate 

Howere,寻找失踪日期,需要一个额外的CTE,我会用创意来自t-sql get all dates between 2 dates它可以看起来像这样:

;WITH dates AS (
    SELECT @startdate AS dt 
    UNION ALL 
    SELECT DATEADD(dd, 1, dt) 
    FROM dates s 
    WHERE DATEADD(dd, 1, dt) <= @enddate 
) 
SELECT SUM(price), 
CASE 
    WHEN EXISTS (SELECT * FROM dates WHERE dt NOT IN (SELECT date1 FROM #t WHERE date1 BETWEEN @Startdate AND @enddate)) THEN 0 
    ELSE MIN(availability) 
END AS Availibility, 
MIN(serviceID) AS serviceID FROM #t 
WHERE date1 BETWEEN @Startdate AND @enddate 
+1

当我输入G马斯特罗斯也发布了一个解决方案,我更喜欢那么我的:)但决定也发布这一个。从两面看都不痛。 –