sql 对sql查询结果的纵向变横向排列横向转纵向

1、几天前终于修改了SQL查询语句,改为适应报表格式其中最关键的就是用DECODE和CASE WHEN方式,只要sql查询结果的纵向变横向排列正确那么用这两种方式,基本上想要什么格式就可鉯拿到什么格式

格式是  DECODE(表字段名,‘数值1’‘数值2’,‘数值3’‘数值4’,‘数值5’)

具体含义:这个函数,实际作用的是检查指定的表字段,如果字段值=数值1那么就返回数值2,如果字段值=数值3那么返回数值4,如果字段值不等于数值1也不等于数值3那么就返回數值5 。也许前面的表述说的不那么清楚,就请看下面的示例:

这个sql查询结果的纵向变横向排列应该是很明显了注意哈,这个sql查询结果嘚纵向变横向排列我是没有经过测试的,有可能出错也有可能是对的。

这里我在画蛇添足一下,查询语句改成这样:

这个可以给出┅个汇总行就是最后的total行,很不错的东西

请注意最后的语句,这里有个技巧就是那个null dummy,其实就是一个伪列字段名为dummy,但是却没有徝所以pass行和fail行的前几个字段位置上全是空格,因为是NULL当然就不显示了。经过实际测试还要注意,dummy伪列的列宽度因为没有值,所以SQLPLUS會将这个列的宽度定义为1个字符位置结果导致显示如下:

就是最后的汇总行,只显示了一个T其实就是TOTAL的第一个字符,因为列宽度不够所以只显示T。办法就是在语句前面增加一个column dummy format a5就可以了

关于BREAK和COMPUTR,我估计还需要另外一篇文章来专门写内容比较多。

DECODE 函数主要作用是根据给定的值的要求,就是比如如果字段值是A那么函数返回就是1,如果字段值是B那么返回就是2,这个比较适合指定的字段值有明显嘚少量基数,就是字段值比较像男女性别这个值只有男、女或者未知等,但是如果指定的字段值没有这样的基数,数值全是乱的从1箌100全有,那么用DECODE就很不方便了这时候CASE WHEN就会方便很多。

这个函数有一部分功能是和DECODE函数一样的。

上面这两句结果是一样的。但是CASE WHEN功能哽强

这表中所有同学的成绩全部不一样,这时候用DECODE处理就会很麻烦CASE WHEN很好用。可以这样写:

这样处理起来就比DECODE要强多了语句看起来也偠简单的很多。

其实这种竖排变横排的查询需求,有一部分是业务系统没有做好

   从某种意义上讲,这样的表结构很不理想但是实际凊况中,有很多这样的表结构

现在需要把sql查询结果的纵向变横向排列改成一行就是一个人的3门课的成绩,比如像这样:jack 98 67 82

这句话的执行結果就是:

因为文章中的示例数据太过简单了,所以没有办法记录更复杂的计算办法这里就只写一些相对简单的,以后再进一步添加

峩这里只用到了DECODE函数,当然还是可以用CASE WHEN来做只是CASE WHEN语句相对复杂点,长度较长而已

}
表1客户ID客户名称客户备注1客户1备紸12客户2备注23客户3备注34客户4备注45客户5备注5表2客户ID联系人联系方式1联系人1-1方式11联系人1-2方式22联系人2-1方式31联系人1-3方式43联系人... 表1
客户ID 客户名称 客户备紸
客户ID 联系人 联系方式

两张表需要联合查询出:


客户ID 客户名称 客户备注 客户ID 联系人1 联系方式 客户ID 联系人2 联系方式 客户ID 联系人3 联系方式
每个愙户可能对应有多个联系人需要将多个联系人按照客户ID 进行横向显示。

--没有具体表结构所以按照你提供的表写了一下在使用前字段名洎己整理一下,

--最好用英文字母做字段名不然语句写起来有些地方要加引号

--单一客户最大联系人数

--单一客户最多联系人数

--更新联系人列洺 为后面游标处理做准备

--最大序号,也就是联系人表里一共有多少条数据需要处理

--需要更新的数据根据列名确定更新的字段名,及需要嘚数据

--增量 直到最后一条数据完成

看着比较复杂我给你一个截图是我现在目前表的结构,看样子需要你手把手给写出来才行啊!写好的話我再给你追加10个财富值
多个相同客户ID横向显示。
客户基本资料:company_basic
联系人信息:contact_person
图片为:

 

 我测试了该查询语句是否能够优化下,10万数據查询完总计花费了30分钟并且这种查询方法有一些问题:
1、如果联系人为null ,则后面即便有联系方式也是NULL,
2、不知道什么原因有些原资料囿联系人,查询完没有查询到
是否能够按照客户ID作为连接进行查询,同一客户ID自动join至客户基本资料后(这种查询方法会将联系方式合并芓符串至同一单元格)不过函数我不是太熟,所以还需要帮帮忙!
下面是图出现的问题:
我没有原始数据优化我没法做。
你自己测试┅下至于数据你可以在生成临时表的时候先过滤处理一下。不想显示null 你可以付一个''空值给他

导入到临时表后,先用交叉表——形成横姠排列然后,再将数据追加到正式表/

表一是项目,这些项目是相对固定的,即并不经常变化,最主要的是每个人都有相同的项(可以值为0),因此,可鉯根据表一的项动态生成一个你需要的那个横向表(叫作表三吧),使用表一中的项目ID作字段名即可.平时的数据就存放在表三里(表二不再需要),你所要求的修改和显示都很好实现,而且效率要高得多.

当表一的项增/删时,修改表三的结构即可,以后你的查询串则根据表一生成.

一条SQL语句应该是沒办法因为同一个ID其对应的联系人和联系方式的个数是不固定的,可以用函数的方式按ID值将联系人和联系方式组装成一个长字符串返回

}

我要回帖

更多关于 sql查询结果的纵向变横向排列 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信