0

両方のテーブルを結合して計算を実行する前に、どちらかのテーブルの行をフラット化または縮小する必要があります

表 - A

StartDate   EndDate        ValueA

2/1/2012    2/1/2012    1

2/2/2012    2/2/2012    2

2/3/2012    2/3/2012    3

2/7/2012    2/8/2012    4

表 - B

startdate   enddate        ValueB

2/1/2012    2/1/2012    4

2/2/2012    2/3/2012    5

2/7/2012    2/7/2012    6

2/8/2012    2/8/2012    7**

結果

StartDate   EndDate        ValueA   ValueB

2/1/2012    2/1/2012    calc    calc

2/2/2012    2/3/2012    calc    calc

2/7/2012    2/8/2012    calc    calc

テーブル A のレコードの場合: テーブル A の start および EndDAte 内にあるテーブル B に複数のレコードがある場合、テーブル A に結合する前にテーブル B のそれらのレコードを「平坦化」または「折りたたむ」必要があります。私の計算を実行する

同様に、テーブル A にテーブル B の Start と EndDate の範囲内にある複数のレコードがあるなど、同じ条件が別の方法で存在する可能性もあります。この場合、テーブル A のそれらのレコードを平坦化して、Start と End に準拠させる必要があります。表 B の日付。

複数のカーソルを使用してこれを達成することはできますが、パフォーマンスは悲惨です。誰かがこの問題に対するより良い解決策を提供できることを願っています

私の質問が皆さんにとって意味のあるものであることを願っています

前もって感謝します

4

1 に答える 1

2

これを試してみてください(おそらく最も効率的ではありません...急いでいたので):

drop table tablea
drop table tableb

CREATE TABLE TableA (startdate DATE, enddate DATE, value INT)
CREATE TABLE TableB (startdate DATE, enddate DATE, value INT)

INSERT TableA SELECT '2/1/2012', '2/1/2012', 1
INSERT TableA SELECT '2/2/2012', '2/2/2012', 2
INSERT TableA SELECT '2/3/2012', '2/3/2012', 3
INSERT TableA SELECT '2/7/2012', '2/8/2012', 4


INSERT TableB SELECT '2/1/2012', '2/1/2012', 4
INSERT TableB SELECT '2/2/2012', '2/3/2012', 5
INSERT TableB SELECT '2/7/2012', '2/7/2012', 6
INSERT TableB SELECT '2/8/2012', '2/8/2012', 7


;WITH tablea_cte AS (
  SELECT
    StartDate
    , EndDate
  FROM
    TableA a
  WHERE EXISTS (SELECT * FROM TableB b WHERE b.startdate >= a.startdate and b.enddate <= a.enddate)  
),
tableb_cte as (
  SELECT
    StartDate
    , EndDate
  FROM
    TableB b
  WHERE EXISTS (SELECT * FROM TableA a WHERE a.startdate >= b.startdate and a.enddate <= b.enddate)  
),
tableab_cte AS (
  SELECT * FROM  tableb_cte union select * FROM tablea_cte
),
sumab_cte as (
  SELECT
    ab.startdate
    , ab.enddate
    , calcA = (SELECT SUM (value) FROM TableA a where a.startdate >= ab.startdate and a.enddate <= ab.enddate)
    , calcB = (SELECT SUM (value) FROM TableB b where b.startdate >= ab.startdate and b.enddate <= ab.enddate)
  FROM
    tableab_cte ab
)
select * from sumab_cte
于 2012-02-28T01:25:05.353 に答える