设备编号(dev_num),
统计码(statistical_code),
管理员号(admin_num),
统计日期(statistical_date),以天计算
交易金额(trade_money)
一天同一个设备号、统计码、管理员,发生交易很多次,交易金额不同,想要把同一个设备号、统计码号、管理员,一天发生的次数和金额总和记录到另一张表中tab2,
设备编号(dev_num),
统计码(statistical_code),
管理员号(admin_num),
统计日期(statistical_date),以天计算
交易金额总和(trade_sum)
交易次数(trade_times),
假设设备号有1000个,统计码有100个,请问怎么做呢,用一个sql语句很难实现,用存储过程怎么做或其他的方法,请高手指点。
12 个解决方案
#1
insert into 另一张表中tab2 (设备编号,统计码,管理员号,统计日期,交易金额) select 设备编号,统计码,管理员号,统计日期,sum(交易金额) from 基础数据表tab1 group by 设备编号,统计码,管理员号,统计日期
#2
建议你列出你的表结构,并提供测试数据以及基于这些测试数据的所对应正确结果。
参考一下这个贴子的提问方式 http://topic.csdn.net/u/20091130/20/8343ee6a-417c-4c2d-9415-fa46604a00cf.html
1. 你的 create table xxx .. 语句
2. 你的 insert into xxx ... 语句
3. 结果是什么样,(并给以简单的算法描述)
4. 你用的数据库名称和版本(经常有人在MS SQL server版问 MySQL)
这样想帮你的人可以直接搭建和你相同的环境,并在给出方案前进行测试,避免文字描述理解上的误差。
#3
感谢ACMAIN_CHM给我的帮助和建议,我会改正,主要是因为基础数据表的字段比较多,显得太乱,所以我没贴出来。
还有你给我的答案,对我启发很大,很有用,已经满足我一半的要求了,就是交易次数怎么计算呢
还有你给我的答案,对我启发很大,很有用,已经满足我一半的要求了,就是交易次数怎么计算呢
#4
对问题的补充:
我把表的一些约束去掉了,只贴上基本字段。
CREATE TABLE if not exists business_monitor_table(
dev_num varchar(15) not null, // 设备编号
statistical_code varchar(10) not null, // 统计码
response_code varchar(8) not null, // 应答码
out_account varchar(25), // 出款方账户
transit_account varchar(25), // 中转账户
in_account varchar(25), // 入款方账户
trade_money decimal(7,2), // 交易金额
admin_account varchar(25), // 管理员账号
trade_time datetime not null, // 交易时间
statistical_time datetime not null, // 统计时间
currency_code varchar(3) not null, // 货币代码
accept_bank_code varchar(20), // 受理行机构代码
accept_bank_inf varchar(20), // 受理行信息
sendout_bank_code varchar(20), // 发卡行机构代码
admin_num varchar(8) not null, // 管理员号
card_type varchar(3)); // 卡种类型
CREATE TABLE day_settlement_table(
settlement_id int key primary key auto_increment, // 无意义主键
dev_num varchar(15) not null, // 设备编号
admin_num varchar(8) not null, // 管理员号
statistical_code varchar(10) not null, // 统计码
trade_times smallint not null, // 统计时间
trade_sum decimal(8,2), // 交易金额总和
statistical_date date not null); // 统计日期
把business_monitor_table表中的数据进行计算后插入到day_settlement_table表中,主要是计算金额总和和交易次数。
我把表的一些约束去掉了,只贴上基本字段。
CREATE TABLE if not exists business_monitor_table(
dev_num varchar(15) not null, // 设备编号
statistical_code varchar(10) not null, // 统计码
response_code varchar(8) not null, // 应答码
out_account varchar(25), // 出款方账户
transit_account varchar(25), // 中转账户
in_account varchar(25), // 入款方账户
trade_money decimal(7,2), // 交易金额
admin_account varchar(25), // 管理员账号
trade_time datetime not null, // 交易时间
statistical_time datetime not null, // 统计时间
currency_code varchar(3) not null, // 货币代码
accept_bank_code varchar(20), // 受理行机构代码
accept_bank_inf varchar(20), // 受理行信息
sendout_bank_code varchar(20), // 发卡行机构代码
admin_num varchar(8) not null, // 管理员号
card_type varchar(3)); // 卡种类型
CREATE TABLE day_settlement_table(
settlement_id int key primary key auto_increment, // 无意义主键
dev_num varchar(15) not null, // 设备编号
admin_num varchar(8) not null, // 管理员号
statistical_code varchar(10) not null, // 统计码
trade_times smallint not null, // 统计时间
trade_sum decimal(8,2), // 交易金额总和
statistical_date date not null); // 统计日期
把business_monitor_table表中的数据进行计算后插入到day_settlement_table表中,主要是计算金额总和和交易次数。
#5
贴生成记录的INSERT语句及要求结果
#6
insert into day_settlement_table (dev_num,admin_num,statistical_code,trad
e_times,trade_sum,statistical_date) select dev_num,admin_num,statistical_code,co
unt(*),sum(trade_money),statistical_time from business_monitor_table group by de
v_num,statistical_code,admin_num,statistical_time;
我要加上统计时间 where DATE(statistical_time)='2010-09-07',应该加在什么地方
e_times,trade_sum,statistical_date) select dev_num,admin_num,statistical_code,co
unt(*),sum(trade_money),statistical_time from business_monitor_table group by de
v_num,statistical_code,admin_num,statistical_time;
我要加上统计时间 where DATE(statistical_time)='2010-09-07',应该加在什么地方
#7
我知道了
insert into day_settlement_table (dev_num,admin_num,statistical_code,trad
e_times,trade_sum,statistical_date) select dev_num,admin_num,statistical_code,co
unt(*),sum(trade_money),statistical_time from business_monitor_table where DATE(statistical_time)='2010-09-07' group by de
v_num,statistical_code,admin_num,statistical_time;
问题已解决
insert into day_settlement_table (dev_num,admin_num,statistical_code,trad
e_times,trade_sum,statistical_date) select dev_num,admin_num,statistical_code,co
unt(*),sum(trade_money),statistical_time from business_monitor_table where DATE(statistical_time)='2010-09-07' group by de
v_num,statistical_code,admin_num,statistical_time;
问题已解决
#8
对了,还有一个问题
CREATE TABLE day_settlement_table(
settlement_id int key primary key auto_increment, // 无意义主键
dev_num varchar(15) not null, // 设备编号
admin_num varchar(8) not null, // 管理员号
statistical_code varchar(10) not null, // 统计码
trade_times smallint not null, // 统计时间
trade_sum decimal(8,2), // 交易金额总和
statistical_date date not null); // 统计日期
CREATE TABLE day_settlement_table(
dev_num varchar(15) not null, // 设备编号
admin_num varchar(8) not null, // 管理员号
statistical_code varchar(10) not null, // 统计码
trade_times smallint not null, // 统计时间
trade_sum decimal(8,2), // 交易金额总和
statistical_date date not null); // 统计日期
这两个表的区别是第一个表比第二个表多了无意义的主键,这两个表哪一个更好,请指教
CREATE TABLE day_settlement_table(
settlement_id int key primary key auto_increment, // 无意义主键
dev_num varchar(15) not null, // 设备编号
admin_num varchar(8) not null, // 管理员号
statistical_code varchar(10) not null, // 统计码
trade_times smallint not null, // 统计时间
trade_sum decimal(8,2), // 交易金额总和
statistical_date date not null); // 统计日期
CREATE TABLE day_settlement_table(
dev_num varchar(15) not null, // 设备编号
admin_num varchar(8) not null, // 管理员号
statistical_code varchar(10) not null, // 统计码
trade_times smallint not null, // 统计时间
trade_sum decimal(8,2), // 交易金额总和
statistical_date date not null); // 统计日期
这两个表的区别是第一个表比第二个表多了无意义的主键,这两个表哪一个更好,请指教
#9
表应该有主键,以唯一确定一条记录,用设备编号做主键不行?
#10
一个设备做很多业务,每个业务用不同的统计码表示,所以设备编号是重复的
#11
一般来讲,主键应该有意义,就你的情况,建议用第1种表设计
#12
恩,我也倾向于第一种,谢谢
#1
insert into 另一张表中tab2 (设备编号,统计码,管理员号,统计日期,交易金额) select 设备编号,统计码,管理员号,统计日期,sum(交易金额) from 基础数据表tab1 group by 设备编号,统计码,管理员号,统计日期
#2
建议你列出你的表结构,并提供测试数据以及基于这些测试数据的所对应正确结果。
参考一下这个贴子的提问方式 http://topic.csdn.net/u/20091130/20/8343ee6a-417c-4c2d-9415-fa46604a00cf.html
1. 你的 create table xxx .. 语句
2. 你的 insert into xxx ... 语句
3. 结果是什么样,(并给以简单的算法描述)
4. 你用的数据库名称和版本(经常有人在MS SQL server版问 MySQL)
这样想帮你的人可以直接搭建和你相同的环境,并在给出方案前进行测试,避免文字描述理解上的误差。
#3
感谢ACMAIN_CHM给我的帮助和建议,我会改正,主要是因为基础数据表的字段比较多,显得太乱,所以我没贴出来。
还有你给我的答案,对我启发很大,很有用,已经满足我一半的要求了,就是交易次数怎么计算呢
还有你给我的答案,对我启发很大,很有用,已经满足我一半的要求了,就是交易次数怎么计算呢
#4
对问题的补充:
我把表的一些约束去掉了,只贴上基本字段。
CREATE TABLE if not exists business_monitor_table(
dev_num varchar(15) not null, // 设备编号
statistical_code varchar(10) not null, // 统计码
response_code varchar(8) not null, // 应答码
out_account varchar(25), // 出款方账户
transit_account varchar(25), // 中转账户
in_account varchar(25), // 入款方账户
trade_money decimal(7,2), // 交易金额
admin_account varchar(25), // 管理员账号
trade_time datetime not null, // 交易时间
statistical_time datetime not null, // 统计时间
currency_code varchar(3) not null, // 货币代码
accept_bank_code varchar(20), // 受理行机构代码
accept_bank_inf varchar(20), // 受理行信息
sendout_bank_code varchar(20), // 发卡行机构代码
admin_num varchar(8) not null, // 管理员号
card_type varchar(3)); // 卡种类型
CREATE TABLE day_settlement_table(
settlement_id int key primary key auto_increment, // 无意义主键
dev_num varchar(15) not null, // 设备编号
admin_num varchar(8) not null, // 管理员号
statistical_code varchar(10) not null, // 统计码
trade_times smallint not null, // 统计时间
trade_sum decimal(8,2), // 交易金额总和
statistical_date date not null); // 统计日期
把business_monitor_table表中的数据进行计算后插入到day_settlement_table表中,主要是计算金额总和和交易次数。
我把表的一些约束去掉了,只贴上基本字段。
CREATE TABLE if not exists business_monitor_table(
dev_num varchar(15) not null, // 设备编号
statistical_code varchar(10) not null, // 统计码
response_code varchar(8) not null, // 应答码
out_account varchar(25), // 出款方账户
transit_account varchar(25), // 中转账户
in_account varchar(25), // 入款方账户
trade_money decimal(7,2), // 交易金额
admin_account varchar(25), // 管理员账号
trade_time datetime not null, // 交易时间
statistical_time datetime not null, // 统计时间
currency_code varchar(3) not null, // 货币代码
accept_bank_code varchar(20), // 受理行机构代码
accept_bank_inf varchar(20), // 受理行信息
sendout_bank_code varchar(20), // 发卡行机构代码
admin_num varchar(8) not null, // 管理员号
card_type varchar(3)); // 卡种类型
CREATE TABLE day_settlement_table(
settlement_id int key primary key auto_increment, // 无意义主键
dev_num varchar(15) not null, // 设备编号
admin_num varchar(8) not null, // 管理员号
statistical_code varchar(10) not null, // 统计码
trade_times smallint not null, // 统计时间
trade_sum decimal(8,2), // 交易金额总和
statistical_date date not null); // 统计日期
把business_monitor_table表中的数据进行计算后插入到day_settlement_table表中,主要是计算金额总和和交易次数。
#5
贴生成记录的INSERT语句及要求结果
#6
insert into day_settlement_table (dev_num,admin_num,statistical_code,trad
e_times,trade_sum,statistical_date) select dev_num,admin_num,statistical_code,co
unt(*),sum(trade_money),statistical_time from business_monitor_table group by de
v_num,statistical_code,admin_num,statistical_time;
我要加上统计时间 where DATE(statistical_time)='2010-09-07',应该加在什么地方
e_times,trade_sum,statistical_date) select dev_num,admin_num,statistical_code,co
unt(*),sum(trade_money),statistical_time from business_monitor_table group by de
v_num,statistical_code,admin_num,statistical_time;
我要加上统计时间 where DATE(statistical_time)='2010-09-07',应该加在什么地方
#7
我知道了
insert into day_settlement_table (dev_num,admin_num,statistical_code,trad
e_times,trade_sum,statistical_date) select dev_num,admin_num,statistical_code,co
unt(*),sum(trade_money),statistical_time from business_monitor_table where DATE(statistical_time)='2010-09-07' group by de
v_num,statistical_code,admin_num,statistical_time;
问题已解决
insert into day_settlement_table (dev_num,admin_num,statistical_code,trad
e_times,trade_sum,statistical_date) select dev_num,admin_num,statistical_code,co
unt(*),sum(trade_money),statistical_time from business_monitor_table where DATE(statistical_time)='2010-09-07' group by de
v_num,statistical_code,admin_num,statistical_time;
问题已解决
#8
对了,还有一个问题
CREATE TABLE day_settlement_table(
settlement_id int key primary key auto_increment, // 无意义主键
dev_num varchar(15) not null, // 设备编号
admin_num varchar(8) not null, // 管理员号
statistical_code varchar(10) not null, // 统计码
trade_times smallint not null, // 统计时间
trade_sum decimal(8,2), // 交易金额总和
statistical_date date not null); // 统计日期
CREATE TABLE day_settlement_table(
dev_num varchar(15) not null, // 设备编号
admin_num varchar(8) not null, // 管理员号
statistical_code varchar(10) not null, // 统计码
trade_times smallint not null, // 统计时间
trade_sum decimal(8,2), // 交易金额总和
statistical_date date not null); // 统计日期
这两个表的区别是第一个表比第二个表多了无意义的主键,这两个表哪一个更好,请指教
CREATE TABLE day_settlement_table(
settlement_id int key primary key auto_increment, // 无意义主键
dev_num varchar(15) not null, // 设备编号
admin_num varchar(8) not null, // 管理员号
statistical_code varchar(10) not null, // 统计码
trade_times smallint not null, // 统计时间
trade_sum decimal(8,2), // 交易金额总和
statistical_date date not null); // 统计日期
CREATE TABLE day_settlement_table(
dev_num varchar(15) not null, // 设备编号
admin_num varchar(8) not null, // 管理员号
statistical_code varchar(10) not null, // 统计码
trade_times smallint not null, // 统计时间
trade_sum decimal(8,2), // 交易金额总和
statistical_date date not null); // 统计日期
这两个表的区别是第一个表比第二个表多了无意义的主键,这两个表哪一个更好,请指教
#9
表应该有主键,以唯一确定一条记录,用设备编号做主键不行?
#10
一个设备做很多业务,每个业务用不同的统计码表示,所以设备编号是重复的
#11
一般来讲,主键应该有意义,就你的情况,建议用第1种表设计
#12
恩,我也倾向于第一种,谢谢