2012-02-27 64 views
0

我需要弄平或者從任一臺摺疊行之前,我可以加入兩個表並執行計算展平排在SQL Server

表 - 一個

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的開始和結束位置之內,那麼我需要在表B中「拼合」或「摺疊」這些記錄,然後才能連接到表A來執行我的計算

同樣,相同的條件可以另一種方式存在,以便表A有多個記錄,這些記錄落在表B的Start和EndDate內,所以在這種情況下,我需要將這些記錄展平A,以便它符合表B的開始和結束日期。

我可以使用多個遊標實現此目標,但性能很可悲,我希望某人能夠爲此問題提供更好的解決方案

我希望我的問題是決策意識給你們

在此先感謝

+1

您如何計劃「摺疊」記錄?和()? AVG()?它們是否需要像PIVOT表這樣的額外列的不同值? – hova 2012-02-27 22:46:14

+0

這看起來像一個空白和孤島問題,除非我不明白結果。爲什麼不是第一行'2/1/2012 - 2/3/2012' – 2012-02-27 22:49:21

+0

這個計算並不複雜,但它基於兩個表中的列。 – armulator 2012-02-28 01:16:07

回答

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 
+1

您可以使用任何要執行的操作更改'SUM'〜 – 2012-02-28 01:28:34

+0

謝謝工作 – armulator 2012-02-29 21:05:37

+0

這種方法可以用8個表嗎? – 2014-05-22 23:50:25