oracle 统计

昨天在搞一个统计查询sql,纠结了3个小时,不过最后还是踩着前辈的肩膀,解决了问题。

select to_timestamp('2012-11-11 01:00:00.0','yyyy-mm-dd hh24:mi:ssxff') from dual;

背景:
     订单项表  表里面有 门票类型 、 购买门票数量字段,以及订单头ID字段。 
      订单头表  与 订单项表是 一对多的关系。表里含有游玩日期和通关状态 
                游玩日期字段同一个门票类型也可以被买多次。 
      景区表    景区表和订单头表是多对多的关系 
      

需求:
     通过 达到如下结果:
        
        景区名称      门票类型    数量       已通关      游玩日期 
        欢乐谷         成人         12        10      2011-01-30 
         欢乐谷2      儿童         9            0      2011-01-30 
         欢乐谷3      军人         20          10      2011-01-30 
     要求
       只用一条sql实现,如上功能
实现过程:
     
SELECT 
    WMSYS.WM_CONCAT(distinct(P.PLACE_NAME)) AS placeName, 
    WMSYS.WM_CONCAT(distinct(O.TICKET_TYPE_NAME)) AS ticketTypName, 
    count(O.QUANTITY) AS ticketCounts, 
    count(decode(OH.STATUS,'已通关', 1)) AS alwaysCarnet, 
    WMSYS.WM_CONCAT(distinct(TO_CHAR(OH.VISIT_DATE, 'yyyy-mm-dd'))) AS visitDate, 
                
FROM 
    PLACES P,ORDER_HEAD_PLACES OHP,ORDER_HEAD OH, ORDERS O 
WHERE 
    OHP.PLACE_ID=P.PLACE_ID 
    AND P.PLACE_ID="某个景区的id" 
    AND OHP.ORDER_HEAD_ID=OH.ORDER_HEAD_ID 
    AND OH.ORDER_HEAD_ID=O.ORDER_HEAD_ID 
    AND TT.TICKET_TYPE_ID=O.TICKET_TYPE_ID 
    AND OH.VISIT_DATE=TO_DATE(游玩时间,'yyyy-mm-dd') 
    AND (OH.STATUS='已通关' OR OH.STATUS='未通关') 
    GROUP BY O.TICKET_TYPE --门票类型 



说明:其实就是 关注一下oracle的 WMSYS.WM_CONCAT decode 方法,好吧,到网上看看它们的用法,这里就不写了。没有啥技术含量,BUT!唯有努力。。。

INSTR(C1,C2,I,J)
在一个字符串中搜索指定的字符,返回发现指定的字符的位置;
C1 被搜索的字符串
C2 希望搜索的字符串
I 搜索的开始位置,默认为1
J 出现的位置,默认为1

substr( string, start_position, [ length ] )
取子字符串,从start_position开始,取length个,length为可选,如果length为空则返回start_position后的所有字符。


declare @xml xml
set @xml='
<root> 
<tag name="艾滋病">新闻1</tag> 
<tag name="艾滋病">新闻2</tag> 
<tag name="健康"></tag> 
</root>'

SELECT @xml.query('/root/tag[@name="艾滋病"]/text()')

--result
--新闻1新闻2



你可能感兴趣的:(oracle,sql)