2

私は次のように2つのテーブルを持っています------

表1

CalenderType  periodNumber periodstartdate
1             1            01-01-2013
1             2            11-01-2013
1             3            15-01-2013
1             4            25-01-2013
2             1            01-01-2013
2             2            15-01-2013
2             3            20-01-2013
2             4            25-01-2013

テーブル2

Incidents  Date
xyz        02-01-2013
xxyyzz     03-01-2013
ccvvb      12-01-2013
vvfg       16-01-2013
x3         17-01-2013
x5         24-01-2013

ここで、特定の期間に発生したインシデントの数を調べたい (カレンダーの種類は実行時に変更される可能性があります) クエリは次のようになります

select ....... 
from ......
where CalendarType=1

返すべきもの

CalendarType PeriodNumber Incidents
1            1            2
1            2            1
1            3            3
1            4            0

誰かが私にこれを達成するためのアプローチや方法を提案できますか?

注: 10 日、5 日など、それぞれperiod変動します。size.peroid1period2

4

2 に答える 2

2

サンプル出力にどのように到達したかはわかりませんが、これはあなたが望むことだと思います:

select t.CalenderType, t.periodNumber, count(*) as Incidents
from Table1 t
inner join (
  select t2.Date, t2.Incidents, max(t1.periodstartdate) as PeriodStartDate
  from Table2 t2
  inner join Table1 t1 on t2.Date >= t1.periodstartdate
  where CalenderType = 1
  group by t2.Date, t2.Incidents
) a on t.periodstartdate = a.PeriodStartDate
where CalenderType=1
group by t.CalenderType, t.periodNumber

SQL フィドルの例

于 2013-03-12T14:16:55.857 に答える
0

これを試してください、もう少し一般的な解決策、SQLFiddle (スキーマについては RedFilter に感謝します):

SELECT t1.CalenderType,  t1.periodNumber, count(Incidents)
FROM Table1 t1, Table1 t11, Table2 
WHERE 
(
  (
    t1.CalenderType = t11.CalenderType 
    AND t1.periodNumber = t11.periodNumber - 1
    AND Date BETWEEN t1.periodstartdate AND t11.periodstartdate 
  ) 
  OR
  (
    t1.periodNumber = (SELECT MAX(periodNumber) FROM Table1 WHERE t1.CalenderType = CalenderType)
    AND Date > t1.periodstartdate
  )

) 
GROUP BY  t1.CalenderType,  t1.periodNumber
ORDER BY  t1.CalenderType,  t1.periodNumber
于 2013-03-12T14:16:20.337 に答える