2014-02-13 13 views
0

假设我在oracle数据库中有两个表 - 一个包含月度数据,另一个包含每日数据,例如,如下所示:Oracle - 按日期加入两个表,其中一个是每日,一个是每月

TblMonthlyData:

MonMatchingCol: MonDateCol: MonCol3:  MonCol4: 
a     01-31-2014  MonVal3a  MonVal4a 
b     01-31-2014  MonVal3b  MonVal4b 
a     12-31-2013  MonVal3c  MonVal4c 
b     12-31-2013  MonVal3d  MonVal4d 
a     11-30-2013  MonVal3e  MonVal4e 
b     11-30-2013  MonVal3f  MonVal4f 

TblDailyData:

DlyMatchingCol DlyDateCol DlyCol3 DlyCol4 
a    01-14-2014 DlyVal3a DlyVal4a 
b    01-14-2014 DlyVal3b DlyVal4b 
a    01-15-2014 DlyVal3c DlyVal4c 
b    01-15-2014 DlyVal3d DlyVal4d 
a    01-16-2014 DlyVal3e DlyVal4e 
b    01-16-2014 DlyVal3f DlyVal4f 
... 
a    02-01-2014 DlyVal3g DlyVal4g 
b    02-01-2014 DlyVal3h DlyVal4h 
a    02-02-2014 DlyVal3i DlyVal4i 
b    02-02-2014 DlyVal3j DlyVal4j 

和我有FO llowing查询:

SELECT 
    Daily.DlyDateCol, Daily.DlyMatchingCol, Daily.DlyCol3, Daily.DlyCol4, Monthly.MonCol3, Monthly.MonCol4 
FROM 
    TblDailyData Daily, 
    TblMonthlyData Monthly 
WHERE 
    Daily.DlyDateCol = '01-14-2014' 
    AND 
    Monthly.MonDateCol = (SELECT MAX(MonDateCol) 
          FROM TblMonthlyData 
          WHERE TblMonthlyData.MonDateCol <= '01-14-2014') 
    AND 
    Daily.DlyMatchingCol = Monthly.MonMatchingCol 

基本上,我在我的月度表在我的日常表每天的数据和月数据,他们有一列将两者结合起来,我想获取最新的月度数据向上那么我们从日常表中拉出来。

所以,这个查询的结果将是:

DlyDateCol: DlyMatchingCol: DlyCol3: DlyCol4: MonCol3: MonCol4: 
01-14-2014 a     DlyVal3a DlyVal4a MonVal3c MonVal4c  
01-14-2014 b     DlyVal3b DlyVal4b MonVal3d MonVal4d  

现在,这个查询的伟大工程,但现在我需要扩展它,这样我可以在拉多天的数据时间(所以不再仅仅为01-14-2014,但现在为01-15-2014 to 02-10-2014)?

该查询将如下的结果如下:

DlyDateCol: DlyMatchingCol: DlyCol3: DlyCol4: MonCol3: MonCol4: 
01-15-2014 a     DlyVal3c DlyVal4c MonVal3c MonVal4c  
01-15-2014 b     DlyVal3d DlyVal4d MonVal3d MonVal4d  
01-16-2014 a     DlyVal3e DlyVal4e MonVal3c MonVal4c  
01-16-2014 b     DlyVal3f DlyVal4f MonVal3d MonVal4d  
... 
02-01-2014 a     DlyVal3g DlyVal4g MonVal3a MonVal4a  
02-01-2014 b     DlyVal3h DlyVal4h MonVal3b MonVal4b  
02-02-2014 a     DlyVal3i DlyVal4i MonVal3a MonVal4a  
02-02-2014 b     DlyVal3j DlyVal4j MonVal3b MonVal4b  
... 

所以,基本上,每天的数据每天都会变化,但月度数据会随着几个月的变化而变化。

我希望这是有道理的。

非常感谢您的帮助!

+0

你能提供一些样本数据和想要的结果吗? –

+0

如果你有条件'Daily.DlyMatchingCol = Monthly.MonMatchingCol',为什么你需要选择'Monthly.MonDateCol'值的子查询? –

+0

@GordonLinoff,我在假样本数据中添加了 - 我很抱歉没有这样做,这只是很多类型,我希望我很好地解释自己...我希望现在有道理.... –

回答

0

MUCH玩弄后,我想出了这个伟大的工作的解决方案 - 把这个在这里如果任何人有一个类似的问题:

SELECT 
    Daily.DlyDateCol, Daily.DlyMatchingCol, Daily.DlyCol3, Daily.DlyCol4, Monthly.MonCol3, Monthly.MonCol4 
FROM 
    TblDailyData Daily, 
    TblMonthlyData Monthly 
WHERE 
    Daily.DlyDateCol BETWEEN '01-15-2014' AND '02-10-2014' 
    AND 
    Monthly.MonDateCol = (SELECT MAX(MonDateCol) 
          FROM TblMonthlyData 
          WHERE MonDateCol <= Daily.DlyDateCol) 
    AND 
    Daily.DlyMatchingCol = Monthly.MonMatchingCol 

这里的整个真正的技巧在MonDateCol <= Daily.DlyDateCol简单地把 - 这使他们relativ e(每个行都按照我的意愿),因此日期正确流通。

我希望这是有道理的,并再次感谢您的所有帮助!

+0

之前我没有看到这个答复:/看起来这样也会起作用。当我最初编写它时,我没有看到每月日期列是每日表格上的那个月的前一个月的结尾。我认为1/15和1/16等将在1月31日的月度表上上涨(因为它们是在1月份)。 –

1

试试这个 -

SQL小提琴(更新14年2月16日)在这里:http://sqlfiddle.com/#!4/d41d8/25423/0

select d.*, m.mondatecol, m.moncol3, m.moncol4 
    from tbldailydata d 
    join tblmonthlydata m 
    on d.dlymatchingcol = m.monmatchingcol 
where m.mondatecol = 
     (select max(x.mondatecol) 
      from tblmonthlydata x 
     where add_months(to_date(d.dlydatecol, 'MM-DD-YYYY'), -1) <= 
       to_date(x.mondatecol, 'MM-DD-YYYY') 
      and m.monmatchingcol = x.monmatchingcol) 
    and d.dlydatecol between '01-15-2014' and '02-10-2014' 
+0

非常感谢你提出这个解决方案,我对缺少样本数据表示歉意。但我觉得我只是表达自己错了。我现在用样本数据更新了问题 - 基本上,我想从每日表格中获取每日数据,并且每月的数据会每天重复一次,直到新月份出现在每月表格中 - I ** HOPE **现在有道理! –

+0

我想我明白了,我只做了2次编辑,确保它是最后一次尝试,我忘记了子查询中的连接。我会尽我所能在sqlfiddle中尝试它,但我认为我会给你测试,以防你更快地进行测试。 –

+0

非常感谢您在此ShWiVeL上的工作 - 您发布的SQL小提琴似乎只从每月的1/31数据中提取两个月的数据,而它应该在12/31中提取1月的结果。 ... 有什么想法吗? –

相关问题