基于ACCESS和ASP的SQL多个表查询与计算统计代码(一)
近期在写几个关于“Project - Subitem - Task”的管理系统,说是系统还是有点夸大了,基本就是一个多表查询调用和insert、update的数据库操作。仅仅是出现不少计算和统计的问题,使得SQL显得复杂。所以。有必要在一个阶段任务完毕后,做一次总结,把一些測试过程中的SQL代码做总结。以防以后用到又忘记了,也欢迎各位DB码农一起吐槽。
这几个月陆续写了几个系统。最后一个系统是信用卡管理系统。也是SQL累积到较复杂的阶段,以这个为样例来整理这段时间以来的基于ACCESS和ASP的SQL多个表查询与计算统计代码是比較合适的。
PS:由于涉及到自己的银行信息安全,隐去了一些信息,但额度、账单金额等还是真实的,是不是非常剁手。
回到正题,信用卡较多,希望用较好的方案统计信用卡账单、额度、还款等等信息。而又不想利用如“51信用卡管理”之类的软件,让人家获取我的財务信息,最好就是自己弄个数据库来解决,放到自己的云主机或虚拟server上去,手机也是一样訪问的。这是做这个简单系统的原因,非常多数据并非一成而就的,而是在用的过程中不断加入须要统计到的信息而改进代码。
建立一个CreditCard的数据库,我採用的是ACCESS2007。扩展名accdb。
总共建立三个表。各自是credit(信用卡信息)、Bill(账单)、Payment(还款)。尽量以最基础的数据录入,降低冗余。很多其它的计算和统计写在ASP上。
正如上面的CreditCard Information的页面,看看SQL的语句:
select Credit.ID as 序号, Credit.CCno as 索引, Credit.Bank as 银行,
Credit.brand as 品牌, Credit.Card as 卡号, Format(Credit.limit,'Currency') as 额度,
Credit.Belong as 持卡人, Credit.billday as 账单日, Credit.consumeday as 消费日,
Count(Bill.CCno) as 账单数, Format(Credit.templimit,'Currency') as 暂时额度,
Format(Credit.unsettled,'Currency') as 未出账单金额,
Format((Credit.limit+Credit.templimit-Credit.unsettled),'Currency') as 剩剩余金额度,
Credit.newtime as 更新时间
FROM Credit LEFT JOIN Bill ON Credit.CCno = Bill.CCno
GROUP BY Credit.ID, Credit.CCno, Credit.Bank, Credit.brand, Credit.Card,
Credit.limit, Credit.Belong, Credit.billday, Credit.consumeday,
Credit.templimit, Credit.unsettled, Credit.newtime
order by Credit.ID
Select语句中在as之后的名称可作为字段(列)的名。对于现实金额计数法和货币符号。则是用Format(字段或表达式。'Currency')得到¥12345.67格式。SQL中是能够用表达式的,如”额度+暂时额度-未出账单金额“能够得到剩剩余金额度等。因为用到Count(统计)Bill表中的相应银行的账单数量。所以用到了两个表的链接。即【Credit】和【Bill】两个表。两个表链接还是比較easy的。採用LEFT、INNER、RIGHT都能够实现Count,但其它使用方法需求里,这三个表链接方式是有差别的,特别在三张表以上的链接的应用就非常重要了。
PS:隐去索引、银行、卡号等。
Bill Payment是三个表的同一时候调用,目的是一览无余地看到信用卡的账单、还款时间、还款情况等方面的信息。且看SQL语句:
select Bill.ID as 序号, Bill.CCno as 索引, Credit.bank as 银行, Credit.Card as 卡号,
Bill.BLno as 账单编号, Month(Bill.billdate) as 账单月份, Bill.paydate as 最后还款日期,
Format(Bill.balance,'Currency') as 本期账单金额, Max(Payment.Paydate) as 还款时间,
IIf(Max(Payment.Paydate) Is Not Null,IIf(Bill.balance-SUM(Payment.balance)<=0,'结清账单','部分还款,余'&Bill.paydate-date()&'天'),IIF(Bill.paydate-date()>0,Bill.paydate-date()&'天','逾期:'&date()-Bill.paydate&'天')) as 剩余还款时间,
Format(SUM(Payment.balance),'Currency') as 还款总金额,
Format(IIf(Bill.balance-SUM(Payment.balance)<=0,0,Bill.balance-SUM(Payment.balance)),'Currency') as 未还款金额,
IIf(Bill.balance-SUM(Payment.balance)<=0,'√','') as 账单完毕
FROM (Credit INNER JOIN Bill ON Credit.CCno = Bill.CCno)
LEFT JOIN Payment ON Bill.BLno = Payment.BLno
GROUP BY Bill.ID, Bill.CCno, Credit.bank, Credit.Card, Bill.BLno,
Bill.billdate, Bill.paydate, Bill.balance
HAVING(Year(Bill.billdate)='2014' AND Month(Bill.billdate)='12')
order by Bill.ID Desc
Select语句中有Month(时间类型字段)来获取月份,也就有year(时间类型字段)、week()等获取相关时间信息。用Max、Min来获取一个字段(列)中最大或最小的数值,这个数值能够是数字或时间类型。
这段Select语句中涉及到了一个if语句。句式:IIF(字段或表达式,表达式为真的结果,表达式为假的结果),表达式能够再嵌套表达式。
对上面”剩余还款时间“这个字段的if语句进行解析。
IIf(Max(Payment.Paydate) Is Not Null,IIf(Bill.balance-SUM(Payment.balance)<=0,'结清账单','部分还款,余'&Bill.paydate-date()&'天'),IIF(Bill.paydate-date()>0,Bill.paydate-date()&'天','逾期:'&date()-Bill.paydate&'天'))as
剩余还款时间
第一个if层(红色)。IIf(Max(Payment.Paydate) Is Not Null,表达式为真的结果,表达式为假的结果),当【Payment】表中的Paydate(这里指还款时间)不是空值的时候(蓝色),也就是这时有【Bill】表中的某月的账单。但这个账单在表【Payment】有值(不是空值)。那么运行”表达式为真的结果“。假设这张信用卡某月的账单还没有还款记录,即还款时间为空值(Null)。那么运行”表达式为假的结果“。
那么这两个真假表达式的结果是什么呢?再看下一个if层(紫色)。IIf(Bill.balance-SUM(Payment.balance)<=0,'结清账单','部分还款,余'&Bill.paydate-date()&'天')。
也就是这时已经有还款记录了。那么这是存在两种状态。即一次性还完了某月账单应还款总额、和仅仅还了部分钱。还剩余一部分没还。
从表达式来看,账单金额-n次还款金额总和≤0。即已经还完所有款项(能够多还钱的,由于大多数时候下个月还会有刷卡,肯定还有账单的),那么就显示”结清账单“;假设账单金额-n次还款金额总和>0,也就是能够还了N次。都没有还完(欠太多钱,要”周转“几次才还完),那么就显示”部分还款,余n天“。
另一个第一层if语句表达式为假的结果(绿色),IIF(Bill.paydate-date()>0,Bill.paydate-date()&'天','逾期:'&date()-Bill.paydate&'天')。也就是最后还款时间-当前日期>0,那么计算最后还款时间-当前日期的天数;否则小于等于0就逾期(由于最后一天还款,并非全部银行都能入账为还款,会第二天记账),逾期N天。
明天再继续解析三个表的链接的方法选择,怎样利用或选择左链接(LEFT JOIN)、内链接(INNER JOIN)和右链接(RIGHT JOIN),他们之间的差别和搭配。
基于ACCESS和ASP的SQL多个表查询与计算统计代码(一)的更多相关文章
- 数据库SQL的多表查询
数据库 SQL 的多表查询:eg: table1: employees, table2: departments,table3: salary_grades; 一:内连接: 1):等值连接: 把表em ...
- mysql,SQL标准,多表查询中内连接,外连接,自然连接等详解之查询结果集的笛卡尔积的演化
先附上数据. CREATE TABLE `course` ( `cno` ) NOT NULL, `cname` ) CHARACTER SET utf8 NOT NULL, `ctime` ) NO ...
- oracle 基础SQL语句 多表查询 子查询 分页查询 合并查询 分组查询 group by having order by
select语句学习 . 创建表 create table user(user varchar2(20), id int); . 查看执行某条命令花费的时间 set timing on: . 查看表的 ...
- SQL总结 连表查询
连接查询包括合并.内连接.外连接和交叉连接,如果涉及多表查询,了解这些连接的特点很重要. 只有真正了解它们之间的区别,才能正确使用. 1.Union UNION 操作符用于合并两个或多个 SELECT ...
- django之 基于queryset和双下划线的跨表查询
前面篇随笔写的是基于对象的跨表查询:对象.objects.filter(...) 对象.关联对象_set.all(...) -->反向 基于对象的跨表查询例如: book_obj= Book ...
- sql语句-单表查询
一:单表查询 CREATE TABLE `Score`( `s_id` ), `c_id` ), `s_score` ), PRIMARY KEY(`s_id`,`c_id`) ); ); ); ); ...
- SQL Fundamentals || 多表查询(内连接,外连接(LEFT|RIGHT|FULL OUTER JOIN),自身关联,ON,USING,集合运算UNION)
SQL Fundamentals || Oracle SQL语言 一.多表查询基本语法 在进行多表连接查询的时候,由于数据库内部的处理机制,会产生一些“无用”的数据,而这些数据就称为笛卡尔积. 多表查 ...
- 【SQL】多表查询
多表查询,即查询可以从两个或多个表中获取数据.在Oracle中,有两种类型的连接格式:ANSI SQL连接格式和Oracle特有的连接格式.Oracle建议采用符合ANSI标准的连接格式. 1.内连接 ...
- Sql Server连表查询字段为null
这是一个坑,并且是有毒的坑. 一不小心我就掉进了这个坑里面,费了好大的力气这才从坑里面爬出来. 话不多说,开始吹BB啦. 一.简单说说遇到的问题: 连表查询,一对多. 出现 int, smallda ...
随机推荐
- 理解依赖注入 for Zend framework 2
依赖注入(Dependency Injection),也成为控制反转(Inversion of Control),一种设计模式,其目的是解除类之间的依赖关系. 假设我们需要举办一个Party,Part ...
- matlab 画图进阶
matlab 画图进阶 applications of matlab in engineering 图表类型的选择 first:advanced 2d plots special plots logl ...
- poj1236 Tarjan算法模板 详解
思想: 做一遍DFS,用dfn[i]表示编号为i的节点在DFS过程中的访问序号(也可以叫做开始时间)用low[i]表示i节点DFS过程中i的下方节点所能到达的开始时间最早的节点的开始时间.初始时dfn ...
- hdu6038[找规律+循环节] 2017多校1
/*hdu6038[找规律+循环节] 2017多校1*/ #include<bits/stdc++.h> using namespace std; typedef long long LL ...
- 【bzoj4785】[Zjoi2017]树状数组 线段树套线段树
题目描述 漆黑的晚上,九条可怜躺在床上辗转反侧.难以入眠的她想起了若干年前她的一次悲惨的OI 比赛经历.那是一道基础的树状数组题.给出一个长度为 n 的数组 A,初始值都为 0,接下来进行 m 次操作 ...
- 【bzoj1040】[ZJOI2008]骑士 并查集+基环树dp
题目描述 Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各界的赞扬.最近发生了一件可怕的事情,邪恶的Y国发动了一场针对Z国的侵略战争.战火绵延五百里,在 ...
- CS231n笔记 Lecture 4 Introduction to Neural Networks
这一讲主要介绍了神经网络,基本内容之前如果学习过Andrew的Machine learning应该也都有所了解了.不过这次听完这一讲后还是有了新的一些认识. 计算图 Computational gra ...
- [luoguP1110] [ZJOI2007]报表统计(set暴力)
传送门 两个multiset 一个记录相邻元素的差,一个放所有的元素 2个数组 val[i]记录第i个的值,last[i]记录第i个最后插入的数的值 然后乱搞 #include <set> ...
- 算法复习——背包dp
1.01背包 二维递推式子: 代码: ;i<=n;i++) ;x--) ][x-w[i]]+c[i],f[i-][x]); ][x]; printf("%d",f[n][m] ...
- 阿里面试题:说说HashMap的扩容过程?
这是一道阿里的面试题,考察你对HashMap源码的了解情况,废话不多说,咱们就直接上源码吧! jdk 1.7 源码 void resize(int newCapacity) { Entry[] old ...