oracle 统计 <sql>

昨天在搞一个统计查询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的 [b]WMSYS.WM_CONCAT [/b]和 [b]decode[/b] 方法,好吧,到网上看看它们的用法,这里就不写了。没有啥技术含量,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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值