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 でグループ化すると無効になるため、これは機能しません。合計、最小の可用性を取得し、連続した日付を確認する方法がわかりません。

編集 結果セットに詳細な仕様を含めたい場合。min(availability) = 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
4

2 に答える 2

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 句で日付をフィルター処理することにより、日付の差分と照合できるカウントまたは行を取得できます。昨日から今日までの DateDiff は 1 だけですが、ソース データでは 2 行を表すため、日付の差分に 1 を追加する必要があることに注意してください。

また、これは実際には連続する日付をチェックしていないことにも言及する必要があります。計算された日数に一致する対応する行数を探しているだけです。

コメントと編集に基づいて、この派生テーブル ソリューションを試してみることをお勧めします。

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
于 2013-03-28T13:07:00.117 に答える
0

日付が欠落しているカーブボールがない場合、クエリは非常に単純になります。

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

ただし、欠落している日付を見つけるには、CTE を 1 つ追加する必要があります。t-sql のアイデアを使用して、2 つの日付の間のすべての日付を取得すると、次のようになります。

;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
于 2013-03-28T13:13:23.953 に答える