在http://oracle.group.iteye.com/group/topic/19806上看到有人提出了一个数据库的问题,在上面看到了解答过程,有一个解答是用了表的关联(没有验证那个解答是否正确),其实不用表的关联,也可以达到效果。只用一个查询,再从结果集中获取数据,这样效率也会更高,因为毕竟只是对查询结果的计算,代价基本可以忽略。现把我的解答,及其分析过程写一下。
题目:一个talbe Material 它的列位有name,type, state, type有A,B,C 它们都有三种state 有New Used Drop 分别用 100,200,300代表,material 是name 与type 确定唯一。比如 数据库中有以下数据
name |
type |
state |
M1 |
A |
100 |
M1 |
B |
200 |
M1 |
C |
300 |
M2 |
A |
200 |
M2 |
B |
100 |
M3 |
C |
100 |
M3 |
A |
200 |
现在要查询出来的结果是 一个Name 就有且仅有一条记录 该记录包括它的所有type 的 状态 如:
name |
AState |
BState |
CState |
M1 |
New |
Used |
Drop |
M2 |
Used |
New |
|
M3 |
Used |
|
New |
|
(1)这个需求里面有2个case when 的要求就是case name (case type when a ),但是数据库的case when 不支持嵌套的case when方式。这样就可以按照2步走,先用一个case when获取一个结果集,然后再在结果集中计算。
name |
a |
b |
c |
M1 |
100 |
200 |
300 |
M2 |
200 |
100 |
0 |
M3 |
200 |
0 |
100 |
|
能获取这个结果集,那么离上面的结果就不远了。
(2) 获取(1)中的结果集,首先我们获取一个简单点的结果集
name |
a |
b |
c |
M1 |
100 |
|
|
M1 |
|
200 |
|
M1 |
|
|
300 |
M2 |
200 |
|
|
M2 |
|
100 |
|
M3 |
|
|
100 |
M3 |
200 |
|
|
|
获取这个结果集,就是说的第一个case when了,sql如下:
select name,
case when type='A' then state else '' end as a,
case when type='B'then state else '' end as b,
case when type='C' then state else '' end as c from material
问题是怎么样得到(1)中的结果集呢?我们应该注意到一个条件,material 是name 与type 是确定唯一,这就好办了,用sum就可以了.
select name,
sum(case when type='A' then state else '' end) as a,
sum(case when type='B'then state else '' end) as b,
sum(case when type='C' then state else '' end) as c from material group by name
这样我们就可以得到(1)中的结果集了。
(3)得到(1)中的结果,我们就完成了第一个case when ,我们再进行第二个case when 就可以得到所要的结果了。这个看看数据库文档里面的case when就可以明白下面这条sql了,就不多说了。
select t.name,
(case when t.a=100 then 'New' when t.a=200 then 'Used' when t.a=300 then 'Drop' else ''end) as AState,
(case when t.b=100 then 'New' when t.b=200 then 'Used' when t.b=300 then 'Drop' else ''end) as BState,
(case when t.c=100 then 'New' when t.c=200 then 'Used' when t.c=300 then 'Drop' else ''end) as CState
from
( select name,
sum(case when type='A' then state else '' end) as a,
sum(case when type='B'then state else '' end) as b,
sum(case when type='C' then state else '' end) as c from material group by name ) t
这样我们就可以用一条sql,并且不用到任何自身关联,就可以得到结果集了。顺便说下,javaeye上面的文档编辑器,真的不好用。插入进去的都变形了,过会再调下。
分享到:
相关推荐
jb51.net是一个知名的技术分享平台,上面常常发布各种软件下载、教程和问题解决方案,用户可以在这个平台上找到更多关于"老兵数据库工具"的信息,包括安装指南、使用技巧和常见问题解答。 总的来说,"老兵数据库...
" 这个问题直指一个常见的困惑:如何在没有DSN(Data Source Name)的情况下连接到Access数据库。在本篇文档中,我们将详细探讨这个问题以及相关的解决方案。 首先,DSN是一种配置好的数据库连接信息,它存储在操作...
数据库系统概论是计算机科学中的一个重要分支,主要探讨如何有效地管理和存储数据。在这个领域,有四个核心概念:数据、数据库、数据库系统和数据库管理系统。 1. 数据(Data):数据是描述客观事物的符号记录,...
3、问题:我在打开软件的时候,一进入模拟考试系统就会出现一个对话框,显示run time error 5 请问这是怎么回事?怎样解决?谢谢 回答:请到官网上下载补丁,具体下载地址:http://ncre.eduexam.cn/ncre.rar,或者...
首页、个人中心、学生管理、教师管理、问题发布管理、疑难解答管理。教师权限:首页、个人中心、疑难解答管理、试卷管理、试题管理、考试管理。学生权限;首页、个人中心、问题发布管理、疑难解答管理、考试管理等...
在上面的例子中,每个索引上都维护一个链表,例如索引0上维护链表{78,15,03,...},索引1上维护链表{...},以此类推。 平均查找长度 平均查找长度(Average Search Length,ASL)是衡量散列表查找效率的指标。...
总之,构建一个ASP.NET BBS论坛是一个涵盖多方面技术的项目,包括前端界面设计、后端逻辑处理、数据库操作、用户认证、安全防护等。这不仅锻炼了开发者的技术能力,也提供了实践软件工程流程和团队协作的宝贵经验。
利用Python语言实现一个漏洞扫描系统,需包括以下功能: 1. 主机漏洞扫描:通过端口扫描、主机发现(Ping命令、ARP请求或ICMP请求)等技术,识别网络中的活跃主机和开放端口,识别可能存在的服务;对已识别的服务...
标题中的“简单的论坛式留言本”指的是一个基于网络的交互平台,用户可以在上面发布留言、进行回复、删除和添加操作。这种系统通常用于提供一种在线交流的方式,让人们能够分享观点、提问或解答问题。在本案例中,这...
《PowerBuilder编程俱乐部常见问题解答.chm》可能是一个包含PB编程中常见问题和解决方案的电子手册。CHM文件是Microsoft的帮助文件格式,通常用于存放帮助文档或教程。用户可以通过这个文件查找PB编程过程中遇到的...
每个员工都有一个 Id,此外还有一列对应员工的经理的 Id。 给定 Employee 表,编写一个 SQL 查询,该查询可以获取收入超过他们经理的员工的姓名。在上面的表格中,Joe 是唯一一个收入超过他的经理的员工。 分析 1....
- SVRMGRL是一个命令行工具,全称为Server Manager。它主要用于早期版本的Oracle数据库,如Oracle 9i及之前版本,用于启动、关闭数据库实例等任务。 9. **如何查看当前连接到Oracle数据库的用户?** - 可以通过...
该资源是一个简易的信息管理系统微信小程序。前端采用的微信小程序的...其目的就是给像当初我这样的新手小白一个参考借鉴的小demo,如果在使用中有任何疑问或者说需要技术解答的可加入博主的qq群:661415118来讨论。
首先,"百思不得姐"通常是指一个基于网络的社交平台,用户可以在上面分享各种有趣的内容,如图片、文字、视频等。这个项目的设计与实现涉及到众多Java Web技术,如Servlet、JSP、JDBC等。通过这个项目,学生可以学习...
7. **教育平台**:这个简单的问答系统可以作为在线教育平台的基础,教师或学生可以在上面发布问题、解答疑惑,促进知识的交流和分享。 总的来说,这个项目展示了如何利用Flask快速构建一个功能齐全的问答系统,对于...
Pudn.com是一个知名的资源共享平台,上面有大量关于编程、数据库等方面的资料,用户可以通过这个链接获取更丰富的学习材料,如SQL Server的实战案例、进阶教程、问题解答等。 SQL Server作为企业级数据库系统,其...
4. readme.txt:这是一个重要的文本文件,通常包含了软件的使用说明、更新日志、系统需求、常见问题解答等信息。用户在安装或使用软件之前,应先阅读这个文件,以获取有关软件的重要细节和提示。 关于SQLite本身,...