超级SQL之报表心得-Oracle

做了几天报表,有了点心得,贴出来给大家分享,以备日后忘了上来查查。

 

1.  取结果集的第一条记录。。。。。。。。。。。。。这个被人问过不下200次了

这个当然用程序可以实现,用SQL可以实现,但是不同的数据库实现起来不一样

select * from (select rownum id ,t.* from llclaimdetail t order by caseno) tt where tt.id=1

 

当然还有一种方法就是如果是按某一列筛选的话  max(),min()也是个讨巧的办法

 

 

2.  按某一列排序

这种实现有通用语法order by tt  asc(desc)

但是假如你懒得想这列叫什么名字的时候我们只要这么写:

Order by 1    ß 按第一列排序。

 

3.  分组显示

Order by group by  都有分组的功能,group by 的要求相应苛刻一些。这个大家可以灵活的试一试。

 

4.  union

本人对jnio掌握得还不好相应部分会在以后补上,这里说个简单的union all

是把相同的记录条目相加

 

select a,
       b,
     sum(c)

  from (  
  select item 1 a , item1 2 b, sum(item3) c
          from tableaa tc
         where aa=’ 1’          group by a, b
        union all

      select item 1 a , item1 2 b, sum(item3) c
          from tablebb  tc
         where bb=’ 1’          group by a, b
  )

看懂没。

 

5.  连表的替代法

连表就是我们理解的 select *  from a,b where a.id=b.id 这样就把两个表相同id的记录作了个全连接。

有的时候我们只是要求某一列是同过这个表里的某几个字段查别的表,但这个字段不是主键,如果这个时候还用这样的连表,就会逻辑混乱。

我们只要这样:

Select

(select a from aa where aa.c=bb.c),

(select a from cc where cc.e=bb.e)

from bb

 

6.  嵌套的效率

嵌套的效率比连表的效率低很多,特别是MYSQL对嵌套查询支持的不好,一般一个嵌套就死机了。

所以在嵌套这个问题上面如果逻辑上面自己能绕得过来的,最好都写成连表的形式。

 

7.  分支

写惯了程序用if else用的爽爽的一到SQL里面用到分支的就范蒙,想想是不是要用函数啊,是不是要写存储过程啊,是不是要把SQL和程序混合的实现功能啊,当然都行,条条大路通罗马嘛。

SQL的分支语法是:

Case  xx   when  条件1  then 实际数据(select aa from cc)

           when  条件2  then 实际数据(select aa from cc)

           else    实际数据(select aa from cc)

end

 

红色部分是必须有的部分,其他是可有可无的。这个SQL你可以灵活的嵌套以上所说的任何一种情况,嵌套多少层都可以。

例如:

select (case ont

        when '4' then ono

        else (case SUBSTR(ono, -2, 2)

            when '99' then (case (select count(*) from lgc where gcn = ono)

                           when 0 then (select pn from bgc where gcn = ono)

                           else (select pn from lgc where gcn = ono)

                           end)

            when '88' then(case (select count(*) from cc where cn = ono)

                            when 0 then (select pn from bc where cn = ono)

                            else (select pn from cc where cn = ono)

                            end)

                end)

          end),

          cc

          from table

看得懂就理解一下。

 

8.  Oracle函数

这个就请大家再往上查一下Oracle函数的文档拉,函数是很全的,我的例子里面就用到了一个字符串函数。

初学oracle报表开发笔记 -- process report output('<HTML xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel">'); output('<head>'); output('<title>库存现有量报表</title>'); output('<style>'); output('body,table{font-size:13px;font-family:"Book Antiqua","Segoe UI", Tahoma, "Trebuchet MS", verdana, helvetica, arial, sans-serif, Georgia;}.text {mso-number-format:"\@";}.retnum {mso-number-format:"0\.00";}'); output('</style>'); output('</head>'); output('<body>'); output('<h2 align=center><B>库存现有量报表</B></h2>'); output('<table width=600 border=0 bordercolor=black>'); output(' <tr>'); output('<th align=right>OU:</th>'); output('<td align=left>' || g_ou_name || '</td>'); output('<th align=right>组织:</th>'); output('<td align=left>' || l_organization_name || '</td>'); output(' </tr>'); output('</table>'); output('<table width=1800 border=1 bordercolor=black>'); output(' <tr>'); output('<th rowspan=1 width=50>库存组织编码</th>'); output('<th rowspan=1 width=50>库存组织说明</th>'); output('<th rowspan=1 width=50>子库编码</th>'); output('<th rowspan=1 width=50>子库说明</th>'); output('<th rowspan=1 width=50>物品编码</th>'); output('<th rowspan=1 width=50>物品说明</th>'); output('<th rowspan=1 width=50>批次</th>'); output('<th rowspan=1 width=50>库存量 </th>'); output('<th rowspan=1 width=50>最小库存量</th>'); output('<th rowspan=1 width=50>最大库存量</th>'); output(' </tr>'); FOR cl IN (select OOD.ORGANIZATION_CODE, --库存组织编码 OOD.ORGANIZATION_NAME, --库存组织说明 MSA.SECONDARY_INVENTORY_NAME subinventory_code, --子库编码 MSA.DESCRIPTION subinventory_name, --子库说明 MSIV.SEGMENT1 item_no, --物品编码 MSIV.DESCRIPTION item_desc, --物品说明 MOQD.LOT_NUMBER, --批次 sum(MOQD.Primary_Transaction_Quantity) Primary_Transaction_Quantity, --库存量 MSIV.MIN_MINMAX_QUANTITY, --最小库存量 MSIV.MAX_MINMAX_QUANTITY --最大库存量 from mtl_onhand_quantities_detail moqd, ORG_ORGANIZATION_DEFINITIONS OOD, mtl_subinventories_all_v MSA, MTL_SYSTEM_ITEMS_VL MSIV where moqd.inventory_item_id = msiv.INVENTORY_ITEM_ID and moqd.organization_id = msiv.ORGANIZATION_ID and moqd.organization_id = ood.ORGANIZATION_ID and moqd.subinventory_code = msa.SECONDARY_INVENTORY_NAME and moqd.organization_id = msa.ORGANIZATION_ID group by OOD.ORGANIZATION_CODE, OOD.ORGANIZATION_NAME, MSA.SECONDARY_INVENTORY_NAME, MSA.DESCRIPTION, MSIV.SEGMENT1, MSIV.DESCRIPTION, MOQD.LOT_NUMBER, MSIV.MIN_MINMAX_QUANTITY, MSIV.MAX_MINMAX_QUANTITY) LOOP output(' <tr>'); output(' <td align=left><font size=1>' || cl.ORGANIZATION_CODE || '</font></td>'); output(' <td align=left><font size=1>' || cl.ORGANIZATION_NAME || '</font></td>'); output(' <td align=left><font size=1>' || cl.subinventory_code || '</font></td>'); output(' <td align=left><font size=1>' || cl.subinventory_name || '</font></td>'); output(' <td align=left><font size=1>' || cl.item_no || '</font></td>'); output(' <td align=left><font size=1>' || cl.item_desc || '</font></td>'); output(' <td align=left><font size=1>' || cl.LOT_NUMBER || '</font></td>'); output(' <td align=left><font size=1>' || cl.Primary_Transaction_Quantity || '</font></td>'); output(' <td align=left><font size=1>' || cl.MIN_MINMAX_QUANTITY || '</font></td>'); output(' <td align=left><font size=1>' || cl.MAX_MINMAX_QUANTITY || '</font></td>'); output(' </tr>');
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值