sqlserver里面多个字段的数据计算以及统计,各位帮帮忙

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sqlserver里面多个字段的数据计算以及统计,各位帮帮忙相关的知识,希望对你有一定的参考价值。

如图表名tbl_Voucher ,字段 issms(0和1),0代表短信,1代表彩信,字段vouchertype(充值,消费,扣费,返还四种类型) userid对应另外一个客户表的主键useridA,useridA下面还有子ID,需求是:根据当前用户的ID查询出他的所有子ID的短信充值数,彩信充值数,短信扣费条数,彩信扣费条数并根据userid列出来。我贴个效果图就如上图,可以用存储过程,麻烦各位大神帮帮忙这个东西我前面没做出来,把他绕过去了,现在回头再坐还是没头绪,实在是没分了但是还是贴出来,希望有人帮帮忙

参考技术A userid对应另外一个客户表的主键useridA,useridA下面还有子ID?

useridA下面还有子ID这是什么意思! 不是属于客户表基本信息嘛!

还是userid是被操作用户,按理说应是一对多的关系.客户表的主键useridA 多个被操作用户

如有问题可以追问,我当及时回答.
希望能帮到你!追问

属于 就像那个省市三级联动那样的
一个ID下面他有子ID,子ID下面也有可能有子ID
怎样获取一个父ID的所有子ID那个我解决了,我写了个函数可以获得

追答

即然父ID的所有子ID那个你解决了.这是重要的一步.

那就没有什么难点了啊。你现在无非就是通过获取的id集合关联tbl_Voucher ,通过issms 和vouchertype分组汇总,然后列转行显示出来就可以了.

MySQL 根据某一个或者多个字段查找重复数据

之前上线了一个类似于微信或者支付宝账单的功能,其中有一张统计表。里面根据用户ID、年、月查询出来当月的订单数以及订单总金额。当时在创建索引的时候,是根据用户ID、年、月字段创建的联合索引。

创表 SQL

CREATE TABLE `stat_order_count` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'id',
  `user_id` bigint NOT NULL DEFAULT '0' COMMENT '用户id',
  `year` int NOT NULL DEFAULT '0' COMMENT '年',
  `month` int NOT NULL DEFAULT '0' COMMENT '月',
  `order_count` int NOT NULL DEFAULT '0' COMMENT '记工次数',
  `order_amount` decimal(32,4) NOT NULL DEFAULT '0.0000' COMMENT '记工金额',
  `record_date` date NOT NULL DEFAULT '1970-01-01' COMMENT '记工归属月(YYYY-MM-DD,其中DD必须为01)',
  `create_at` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间',
  `update_at` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3) COMMENT '更新时间',
  PRIMARY KEY (`id`),
  KEY `idx_user_id_record_date` (`user_id`,`record_date`),
  KEY `idx_create_at` (`create_at`),
  KEY `idx_update_at` (`update_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='按月统计订单数与金额';

整个核心逻辑如下:

  • 如果当前用户在当前年当前月没有数据就初始化
  • 如果当前用户在当前年当前月有数据就更改统计信息

在非生产环境由于数据库没有进行主从分离,所以在测试的时候没有问题。当项目进行上线的时候,生产环境的数据库进行主从分离。数据新增操作的是主库,数据查询操作的是从库。如果两条数据间隔时间比较短的话,第一条数据新增到主库,第二条数据查询从库就会查询不到。同一个用户在当前年,当前月就会有多条。这样在查询用户月账单信息的时候就会查询出来多条,就会报错。

这个时候就需要把重复的数据查询出来进行删除,然后再把原来的联合索引删除,添加唯一索引。以下是查询出重复数据的 SQL:

查询重复数据.sql

select b.id
  from(
select id
  from stat_order_count a
 where(a.user_id, a.year, a.month)  in(
select user_id, year, month
  from stat_order_count
 group by user_id, year, month
having count(*)> 1))  b
 where b.id not in(
select min(id)  as id
  from stat_order_count
 group by user_id, year, month
having count(*)> 1)

根据查询出来的 ID 进行数据删除,然后再更新索引。

更新索引.sql

> 删除原有联合索引
alter table stat_order_count drop index idx_user_id_year_month;

> 添加唯一索引
alter table stat_order_count add UNIQUE index uk_user_id_year_month(`user_id`,`year`,`month`);

最后在数据查询的时候强制查询阿里云主库:

强制查询主库.sql

/*FORCE_MASTER*/ SELECT * FROM stat_order_count 
where user_id = ? and year = ? and month = ?;

参考文章:

  • https://www.jb51.net/article/152155.htm
  • https://help.aliyun.com/knowledge_detail/52221.html

以上是关于sqlserver里面多个字段的数据计算以及统计,各位帮帮忙的主要内容,如果未能解决你的问题,请参考以下文章

如何获取sqlserver中精确到毫秒的时间

SQLServer 2008 PIVOT 上的多个字段问题

MySQL 根据某一个或者多个字段查找重复数据

MySQL 根据某一个或者多个字段查找重复数据

请教一个sqlserver有关记录条数统计查询语句问题

sqlserver自定义函数里面 怎么循环查询多条结果集