现在有两张表:
表1:一个字段为id,time,c1,c2
表1:一个字段为id,time,c3
还有一个计算公式,例如c1+c2/c3,
现在需要生成一个动态表:字段为id,time,c1,c2,c3,result,其中result存放c1,c2,c3通过公式计算的结果。
c1、c2字段的数据通过下面的sq语句按照id进行汇总,汇总算法为求和:
select sum(c1),sum(c2) from table1 group by id,time;
c3字段的数据通过下面的sq语句按照id进行汇总,汇总算法为求和:
select sum(c3) from table2 group by id,time;
现在需要将c1、c2和c3汇总的数据先放到缓存里(因为字段来自不同的表,所以直接插入到目标表效率较低),然后再将缓存里的数据逐条插入到目标表里,然后再从目标表里取出数据按照公式进行计算,插入到result字段。
请大神们指教下这个问题有没有比较高效的实现方法,小弟刚学习java不久,写了实现代码,但是感觉太繁琐,跪求大侠们指教~~
举个例子:
例如table1 数据如下:
id time c1 c2
1 2017/10/29 1 2
1 2017/10/29 2 4
2 2017/10/29 3 6
2 2017/10/29 4 8
1 2017/10/30 1 2
1 2017/10/30 2 4
2 2017/10/39 3 6
2 2017/10/30 4 8
那么执行如下语句
select sum(c1),sum(c2) from table1 group by id,time;
结果是
id time c1 c2
1 2017/10/29 3 6
2 2017/10/29 7 14
1 2017/10/30 3 6
2 2017/10/30 7 14
同理假设talbe2进行group后得到以下数据:
id time c3
1 2017/10/29 3
2 2017/10/29 3
1 2017/10/30 3
2 2017/10/30 3
现在计算公式是result = (c1+c2)/c3,那么希望得到最后的表数据是
id time c1 c2 c3 result
1 2017/10/29 3 6 3 3
2 2017/10/29 7 14 3 7
1 2017/10/30 3 6 3 3
2 2017/10/30 7 14 3 7
4 个解决方案
#1
--测试数据
if not object_id(N'Tempdb..#T1') is null
drop table #T1
Go
Create table #T1([id] int,[time] Date,[c1] int,[c2] int)
Insert #T1
select 1,'2017/10/29',3,6 union all
select 2,'2017/10/29',7,14 union all
select 1,'2017/10/30',3,6 union all
select 2,'2017/10/30',7,14
GO
if not object_id(N'Tempdb..#T2') is null
drop table #T2
Go
Create table #T2([id] int,[time] Date,[c3] int)
Insert #T2
select 1,'2017/10/29',3 union all
select 2,'2017/10/29',3 union all
select 1,'2017/10/30',3 union all
select 2,'2017/10/30',3
Go
--测试数据结束
--上边那两个是group玩之后的结果表
--然后不要一条一条的插入数据了,直接一次性读取插入
SELECT #T1.id ,
#T1.time ,
c1 ,
c2 ,
c3 ,
( c1 + c2 ) / c3 AS result
FROM #T1
JOIN #T2 ON #T2.id = #T1.id
AND #T2.time = #T1.time;
#2
declare @T1 table ([id] int,[time] Date,[c1] int,[c2] int)
Insert @T1
select 1,'2017/10/29',1,2 union all
select 1,'2017/10/29',2,4 union all
select 2,'2017/10/29',3,6 union all
select 2,'2017/10/29',4,8 union all
select 1,'2017/10/30',1,2 union all
select 1,'2017/10/30',2,4 union all
select 2,'2017/10/30',3,6 union all
select 2,'2017/10/30',4,8
declare @T2 table([id] int,[time] Date,[c3] int)
Insert @T2
select 1,'2017/10/29',3 union all
select 2,'2017/10/29',3 union all
select 1,'2017/10/30',3 union all
select 2,'2017/10/30',3
select t1.id,t1.time,t1.c1,t1.c2,t2.c3,(c1+c2)/c3 result
from (select id,time,sum(c1)c1,sum(c2)c2 from @t1 group by id,time) t1
left join
(select id,time,sum(c3)c3 from @t2 group by id,time) t2
on t1.id=t2.id and t1.time=t2.time
/*
1 2017-10-29 3 6 3 3
1 2017-10-30 3 6 3 3
2 2017-10-29 7 14 3 7
2 2017-10-30 7 14 3 7
*/
#3
多谢各位大神的回复。不过有个问题,是我忘记描述了,就是C1,C2,C3可能来自不同的表,这个在下面的表中定义:
id tableid
c1 111
c2 222
c3 333
其中tableid是另外一张表的主键,这张表定义了这个字段来哪张表的哪个字段。例如
id tablename field
111 table1 a
222 table2 b
333 table3 c
就是说c1来自 table1的a字段,依次类推,而且需要将c1,c2,c3 group by的结果用java语言放到内存里,然后用公式算出结果,再将id 、time、c1、c2、c3、result插入到一个表中,要用java实现,根据好复杂。。。
id tableid
c1 111
c2 222
c3 333
其中tableid是另外一张表的主键,这张表定义了这个字段来哪张表的哪个字段。例如
id tablename field
111 table1 a
222 table2 b
333 table3 c
就是说c1来自 table1的a字段,依次类推,而且需要将c1,c2,c3 group by的结果用java语言放到内存里,然后用公式算出结果,再将id 、time、c1、c2、c3、result插入到一个表中,要用java实现,根据好复杂。。。
#4
就是 id,time 每个表都默认存在 就 c1,c2这些需要sum先?
那就根据你的 配置表 表 进行拼接 sql or java端都可以做
那就根据你的 配置表 表 进行拼接 sql or java端都可以做
#1
--测试数据
if not object_id(N'Tempdb..#T1') is null
drop table #T1
Go
Create table #T1([id] int,[time] Date,[c1] int,[c2] int)
Insert #T1
select 1,'2017/10/29',3,6 union all
select 2,'2017/10/29',7,14 union all
select 1,'2017/10/30',3,6 union all
select 2,'2017/10/30',7,14
GO
if not object_id(N'Tempdb..#T2') is null
drop table #T2
Go
Create table #T2([id] int,[time] Date,[c3] int)
Insert #T2
select 1,'2017/10/29',3 union all
select 2,'2017/10/29',3 union all
select 1,'2017/10/30',3 union all
select 2,'2017/10/30',3
Go
--测试数据结束
--上边那两个是group玩之后的结果表
--然后不要一条一条的插入数据了,直接一次性读取插入
SELECT #T1.id ,
#T1.time ,
c1 ,
c2 ,
c3 ,
( c1 + c2 ) / c3 AS result
FROM #T1
JOIN #T2 ON #T2.id = #T1.id
AND #T2.time = #T1.time;
#2
declare @T1 table ([id] int,[time] Date,[c1] int,[c2] int)
Insert @T1
select 1,'2017/10/29',1,2 union all
select 1,'2017/10/29',2,4 union all
select 2,'2017/10/29',3,6 union all
select 2,'2017/10/29',4,8 union all
select 1,'2017/10/30',1,2 union all
select 1,'2017/10/30',2,4 union all
select 2,'2017/10/30',3,6 union all
select 2,'2017/10/30',4,8
declare @T2 table([id] int,[time] Date,[c3] int)
Insert @T2
select 1,'2017/10/29',3 union all
select 2,'2017/10/29',3 union all
select 1,'2017/10/30',3 union all
select 2,'2017/10/30',3
select t1.id,t1.time,t1.c1,t1.c2,t2.c3,(c1+c2)/c3 result
from (select id,time,sum(c1)c1,sum(c2)c2 from @t1 group by id,time) t1
left join
(select id,time,sum(c3)c3 from @t2 group by id,time) t2
on t1.id=t2.id and t1.time=t2.time
/*
1 2017-10-29 3 6 3 3
1 2017-10-30 3 6 3 3
2 2017-10-29 7 14 3 7
2 2017-10-30 7 14 3 7
*/
#3
多谢各位大神的回复。不过有个问题,是我忘记描述了,就是C1,C2,C3可能来自不同的表,这个在下面的表中定义:
id tableid
c1 111
c2 222
c3 333
其中tableid是另外一张表的主键,这张表定义了这个字段来哪张表的哪个字段。例如
id tablename field
111 table1 a
222 table2 b
333 table3 c
就是说c1来自 table1的a字段,依次类推,而且需要将c1,c2,c3 group by的结果用java语言放到内存里,然后用公式算出结果,再将id 、time、c1、c2、c3、result插入到一个表中,要用java实现,根据好复杂。。。
id tableid
c1 111
c2 222
c3 333
其中tableid是另外一张表的主键,这张表定义了这个字段来哪张表的哪个字段。例如
id tablename field
111 table1 a
222 table2 b
333 table3 c
就是说c1来自 table1的a字段,依次类推,而且需要将c1,c2,c3 group by的结果用java语言放到内存里,然后用公式算出结果,再将id 、time、c1、c2、c3、result插入到一个表中,要用java实现,根据好复杂。。。
#4
就是 id,time 每个表都默认存在 就 c1,c2这些需要sum先?
那就根据你的 配置表 表 进行拼接 sql or java端都可以做
那就根据你的 配置表 表 进行拼接 sql or java端都可以做