我有2张桌子,我试图弄清楚把它放在一起的最好方法。下面是表A,表B和我想要实现的结果:
TABLE A
[THE_DATE]
1/8
1/10
2/1
2/15
3/1
3/30
4/23
TABLE B
[SOURCE] [VALUE] [EFFECTIVE_DT_ST] [EFFECTIVE_DT_END]
John 25,000 1/1 3/10
Bill 10,000 1/1 2/18
Jack 5,000 2/10 3/31
Tom 12,000 2/20 12/31/2999
ALL 50,000 4/1 12/31/2999
RESULTS
DATE VALUE_SUM
1/8 35,000 (john+bill)
1/10 35,000 (john+bill)
2/1 35,000 (john+bill)
2/15 40,000 (john+bill+jack)
3/1 42,000 (john+jack+tom)
3/30 17,000 (jack+tom)
4/23 50,000 (all)
我尝试实现的psuedo代码:
FOR EACH [THE_DATE] IN TABLE A GET [VALUE] FROM TABLE B
IF [THE_DATE] < SELECT MIN(EFFECTIVE_DT_ST) FROM TABLEB WHERE SOURCE = 'ALL')
SUM(VALUE) WHERE [THE_DATE] > EFFECTIVE_DT_ST AND [THE_DATE] < EFFECTIVE_DT_END
AND SOURCE <> 'ALL'
ELSE
VALUE WHERE [THE_DATE] [THE_DATE] > EFFECTIVE_DT_ST AND [THE_DATE] < EFFECTIVE_DT_END
AND SOURCE = 'ALL'
感谢先生,我们非常感谢任何帮助!
答案 0 :(得分:1)
我相信你想要这样的东西:
SELECT A.THE_DATE, SUM(B.VALUE) AS VALUE_SUM
FROM A
INNER JOIN B ON
B.EFFECTIVE_DT_ST <= A.THE_DATE AND
B.EFFECTIVE_DT_END >= A.THE_DATE
GROUP BY A.THE_DATE
将所有A.THE_DATE值与A.THE_DATE存在的任何帐户相关联的广告素材联接。您不一定需要主键/外键来连接两个表。
当然,你要对B.VALUE求和,所以你必须在A.THE_DATE进行分组。
如果你没有全部&#39;将表格排成行,您可以通过将WITH ROLLUP添加到GROUP BY来汇总值,以获得总和的底行。要在该行中获得良好的A.THE_DATE值(而不是null),请在SELECT语句中执行此操作:IFNULL(A.THE_DATE,&#34;所有日期&#34;)
我假设您的日期存储为SQL DATE格式。您可以在SELECT语句中格式化它们。
如果有帮助,请告诉我。