`
shenkun_918
  • 浏览: 27580 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

解答论坛上面的一个数据库问题

阅读更多

    在http://oracle.group.iteye.com/group/topic/19806上看到有人提出了一个数据库的问题,在上面看到了解答过程,有一个解答是用了表的关联(没有验证那个解答是否正确),其实不用表的关联,也可以达到效果。只用一个查询,再从结果集中获取数据,这样效率也会更高,因为毕竟只是对查询结果的计算,代价基本可以忽略。现把我的解答,及其分析过程写一下。

    题目:一个talbe  Material 它的列位有name,type, state,  typeA,B,C 它们都有三种state New Used Drop 分别用 100200300代表,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)这个需求里面有2case 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上面的文档编辑器,真的不好用。插入进去的都变形了,过会再调下。

 

 

 

 

 

 

分享到:
评论

相关推荐

    ASP技术常遇问题解答-不通过数据源名DSN也能访问Access数据库吗?.zip

    " 这个问题直指一个常见的困惑:如何在没有DSN(Data Source Name)的情况下连接到Access数据库。在本篇文档中,我们将详细探讨这个问题以及相关的解决方案。 首先,DSN是一种配置好的数据库连接信息,它存储在操作...

    数据库系统概论-课后答案.doc

    数据库系统概论是计算机科学中的一个重要分支,主要探讨如何有效地管理和存储数据。在这个领域,有四个核心概念:数据、数据库、数据库系统和数据库管理系统。 1. 数据(Data):数据是描述客观事物的符号记录,...

    C语言上机问题解答

    3、问题:我在打开软件的时候,一进入模拟考试系统就会出现一个对话框,显示run time error 5 请问这是怎么回事?怎样解决?谢谢 回答:请到官网上下载补丁,具体下载地址:http://ncre.eduexam.cn/ncre.rar,或者...

    基于SpringBoot的在线答疑系统(源码+数据库+文档+PPT)

    首页、个人中心、学生管理、教师管理、问题发布管理、疑难解答管理。教师权限:首页、个人中心、疑难解答管理、试卷管理、试题管理、考试管理。学生权限;首页、个人中心、问题发布管理、疑难解答管理、考试管理等...

    Ch6部分习题解答1

    在上面的例子中,每个索引上都维护一个链表,例如索引0上维护链表{78,15,03,...},索引1上维护链表{...},以此类推。 平均查找长度 平均查找长度(Average Search Length,ASL)是衡量散列表查找效率的指标。...

    asp.net BBS论坛

    总之,构建一个ASP.NET BBS论坛是一个涵盖多方面技术的项目,包括前端界面设计、后端逻辑处理、数据库操作、用户认证、安全防护等。这不仅锻炼了开发者的技术能力,也提供了实践软件工程流程和团队协作的宝贵经验。

    基于Django框架+python实现的漏洞扫描系统源码+sql数据库+详细项目说明.zip

    利用Python语言实现一个漏洞扫描系统,需包括以下功能: 1. 主机漏洞扫描:通过端口扫描、主机发现(Ping命令、ARP请求或ICMP请求)等技术,识别网络中的活跃主机和开放端口,识别可能存在的服务;对已识别的服务...

    简单的论坛式留言本~~~

    标题中的“简单的论坛式留言本”指的是一个基于网络的交互平台,用户可以在上面发布留言、进行回复、删除和添加操作。这种系统通常用于提供一种在线交流的方式,让人们能够分享观点、提问或解答问题。在本案例中,这...

    pb编程俱乐部

    《PowerBuilder编程俱乐部常见问题解答.chm》可能是一个包含PB编程中常见问题和解决方案的电子手册。CHM文件是Microsoft的帮助文件格式,通常用于存放帮助文档或教程。用户可以通过这个文件查找PB编程过程中遇到的...

    LeetCode力扣刷题数据库(181):超过经理收入的员工

    每个员工都有一个 Id,此外还有一列对应员工的经理的 Id。 给定 Employee 表,编写一个 SQL 查询,该查询可以获取收入超过他们经理的员工的姓名。在上面的表格中,Joe 是唯一一个收入超过他的经理的员工。 分析 1....

    oracle常见问题 971个.txt

    - SVRMGRL是一个命令行工具,全称为Server Manager。它主要用于早期版本的Oracle数据库,如Oracle 9i及之前版本,用于启动、关闭数据库实例等任务。 9. **如何查看当前连接到Oracle数据库的用户?** - 可以通过...

    信息管理系统微信小程序.zip

    该资源是一个简易的信息管理系统微信小程序。前端采用的微信小程序的...其目的就是给像当初我这样的新手小白一个参考借鉴的小demo,如果在使用中有任何疑问或者说需要技术解答的可加入博主的qq群:661415118来讨论。

    java毕业设计&课设-百思不得姐.zip

    首先,"百思不得姐"通常是指一个基于网络的社交平台,用户可以在上面分享各种有趣的内容,如图片、文字、视频等。这个项目的设计与实现涉及到众多Java Web技术,如Servlet、JSP、JDBC等。通过这个项目,学生可以学习...

    基于Flask的简单问答系统设计源码

    7. **教育平台**:这个简单的问答系统可以作为在线教育平台的基础,教师或学生可以在上面发布问题、解答疑惑,促进知识的交流和分享。 总的来说,这个项目展示了如何利用Flask快速构建一个功能齐全的问答系统,对于...

    SQL Help.rar_Help!_sql_sql server_sqlhelp sqlserver

    Pudn.com是一个知名的资源共享平台,上面有大量关于编程、数据库等方面的资料,用户可以通过这个链接获取更丰富的学习材料,如SQL Server的实战案例、进阶教程、问题解答等。 SQL Server作为企业级数据库系统,其...

    SQLite Expert Professional.zip

    4. readme.txt:这是一个重要的文本文件,通常包含了软件的使用说明、更新日志、系统需求、常见问题解答等信息。用户在安装或使用软件之前,应先阅读这个文件,以获取有关软件的重要细节和提示。 关于SQLite本身,...

    谜语及答案大全 v1.3-ASP源码.zip

    这个应用可能是一个在线的谜语游戏平台,用户可以在上面浏览和解答各种谜语。版本号v1.3表明这是该程序的第三个主要更新版本,通常意味着它经过了多次迭代和优化,以提供更好的用户体验和稳定性。 【压缩包内容】 ...

    Java面试2024-7.5基础必备详情包含解答.docx

    - **抽象**:面向对象编程的一个核心概念,指的是通过剥离非本质特性来关注实体的关键特征,从而简化问题的处理。例如,在设计一个“汽车”类时,我们可以忽略其具体的制造过程或内部机械结构,而重点关注其品牌、...

Global site tag (gtag.js) - Google Analytics