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 中的记录:如果表 B 中有多个记录在表 A 的 start 和 EndDate 内,那么我需要先“展平”或“折叠”表 B 中的这些记录,然后才能加入表 A执行我的计算

同样的,同样的条件也可以反过来存在,比如表 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 回答