昨天在搞一个统计查询sql,纠结了3个小时,不过最后还是踩着前辈的肩膀,解决了问题。
select to_timestamp('2012-11-11 01:00:00.0','yyyy-mm-dd hh24:mi:ssxff') from dual;
背景:
需求:
通过 达到如下结果:
只用一条sql实现,如上功能
实现过程:
说明:其实就是 关注一下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后的所有字符。
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