oracle sql 问题两道

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle sql 问题两道相关的知识,希望对你有一定的参考价值。

航空数据表 : 顾客id 航班 航空公司(东航,南航,北航) 飞行日期

列出 某个顾客乘坐相对自己乘坐东航次数是最多的 比如顾客a 乘坐东航 6 次,南航4次,北航5次 那a就列出来,顾客b 东航2次 南航3次 北航4次 就不列出。
第二题 列出连续两天飞行的客户

比如客户 a 五月10号坐飞机 11也坐飞机 那就被列出来!!

1.
SELECT
顾客id ,
SUM( DECODE( 航空公司, '东航', 1, 0 ) AS "乘坐东航次数",
SUM( DECODE( 航空公司, '南航', 1, 0 ) AS "乘坐东航次数",
SUM( DECODE( 航空公司, '北航', 1, 0 ) AS "乘坐东航次数"
FROM
航空数据表
GROUP BY
顾客id
HAVING
SUM( DECODE( 航空公司, '东航', 1, 0 ) > SUM( DECODE( 航空公司, '南航', 1, 0 )
AND SUM( DECODE( 航空公司, '东航', 1, 0 ) > SUM( DECODE( 航空公司, '北航', 1, 0 )

2.
SELECT
顾客id
FROM
航空数据表
WHERE
EXISTS (
SELECT 1 FROM 航空数据表 AS t
WHERE 航空数据表.顾客id = t.顾客id
AND TRUNC( 航空数据表.飞行日期, 'D' ) = AND TRUNC( t.飞行日期, 'D' ) + 1
)追问

如过很多 数据呢??不只是 东航 北航 南航!!那一个个 decode 岂不是很麻烦??

追答

CREATE TABLE "航空数据表"(
"顾客id" VARCHAR2(10),
"航班" VARCHAR2(10),
"航空公司" VARCHAR2(10),
"飞行日期" DATE
);

INSERT INTO "航空数据表"
SELECT 'a', '1', '东航', SYSDATE-1 FROM dual UNION ALL
SELECT 'a', '2', '东航', SYSDATE-2 FROM dual UNION ALL
SELECT 'a', '3', '东航', SYSDATE-3 FROM dual UNION ALL
SELECT 'a', '4', '南航', SYSDATE-4 FROM dual UNION ALL
SELECT 'a', '5', '南航', SYSDATE-5 FROM dual UNION ALL
SELECT 'a', '6', '西航', SYSDATE-6 FROM dual UNION ALL
SELECT 'a', '7', '北航', SYSDATE-7 FROM dual UNION ALL
SELECT 'a', '8', '下航', SYSDATE-8 FROM dual UNION ALL
SELECT 'a', '9', '上航', SYSDATE-9 FROM dual UNION ALL
SELECT 'b', '0', '南航', SYSDATE-10 FROM dual UNION ALL
SELECT 'b', '1', '西航', SYSDATE-11 FROM dual UNION ALL
SELECT 'b', '2', '北航', SYSDATE-12 FROM dual UNION ALL
SELECT 'b', '3', '下航', SYSDATE-13 FROM dual UNION ALL
SELECT 'b', '4', '下航', SYSDATE-14 FROM dual UNION ALL
SELECT 'b', '5', '东航', SYSDATE-15 FROM dual UNION ALL
SELECT 'b', '6', '上航', SYSDATE-16 FROM dual;

SQL> SELECT
2 *
3 FROM
4 (
5 SELECT
6 DISTINCT
7 "顾客id",
8 MAX( "航空公司" ) KEEP (DENSE_RANK FIRST ORDER BY COUNT(1) DESC)
9 OVER (PARTITION BY "顾客id") AS "乘坐最多的次数的航空公司"
10 FROM
11 "航空数据表"
12 GROUP BY
13 "顾客id",
14 "航空公司"
15 ) tmp
16 WHERE
17 tmp."乘坐最多的次数的航空公司" = '东航';

顾客id 乘坐最多的
---------- ----------
a 东航

参考技术A 1.使用PL/SQL编程将100以内的素数输出。 2.编写PL/SQL块,使用SLQ*Plus第一题 SET SERVEROUT ON DECLARE V_FLAG BOOLEAN; BEGIN FOR I IN 2 参考技术B 1. -----首先构建一个顾客乘坐东航飞机总次数的表t,然后按照乘坐次数从大到小排序,取第一行。就是最大的那个信息了。
select * from
(select 顾客id, sum(1) as 航班次数 from 航空数据表 where 航空公司 = '东航' group by 顾客id order by sum(1) desc) t where rownum <= 1

2.----------查询条件就是存在abs(trunc(t.飞行日期) - trunc(t1.飞行日期)) = 1,即表中存在相邻两天飞行日期的数据。abs是取绝对值,trunc是把日期类型去小时分秒的函数
select distinct 客户id from 航空数据表 t where exists (select 1 from 航空数据表 t1 where t.顾客id = t1.顾客id and abs(trunc(t.飞行日期) - trunc(t1.飞行日期)) = 1 )

sql server 2008 链接 ORACLE 问题

环境:windows 2008 r2 64位, sql server 2008
linux oracle 10g 64位
先想做sql server 与 oracle的链接,oracle 客户端已安装 32位(64位的也装过,问题同样)链接信息也配置过了,数据源(32位的)及sql服务都设置过了,
但是在新建链接服务器事 不能找到借口 Microsoft OLEDB Provider for Oracle 或Oracle Provider for OLEDB 接口。请高人指教。

前段时间我装ORACLE11G的时候,也出现无法找到Microsoft OLEDB Provid er for Oracle  这个驱动,后来重新安装ORACLE 好了,不过我能确定的是,ORACLE 10G 安装的时候出现了问题,楼主能保证你的安装包或者安装的时候,没有任何问题么,如果安装了后,你可以用文本来查看是否有驱动。如图:   如果没接口,我能肯定是你安装ORACLE出了问题,卸载重新安装即可,祝你成功!

参考技术A 问题很明显,就是oracle客户端没有安装完整。
请到官网下载完整版的oracle 10g 64位客户端,然后安装时选择administration 那个安装完整版,重启系统后在sql 2008中的服务器对象--链接服务器--访问接口中会看见MSDAORA,ORACLE.***(忘记叫什么了)这两个驱动,右击两个驱动的属性,将”动态参数’、“仅零级”前面的勾打上,不然新建链接服务器不会成功,再次新建链接服务器就会成功。而且64位的操作系统中的sql 2008很多驱动不全,必要时可能要下载很多相关的64位驱动。
参考技术B 这个问题我也遇到过 不过前面是装10g出现的问题 装了11g的客户端就可以选出来了 参考技术C 安装相应的oracle客户端,建立链接服务器时选择:Microsoft OLEDB Provid er for Oracle 参考技术D sql server的服务器机器没有装oracle客户端

以上是关于oracle sql 问题两道的主要内容,如果未能解决你的问题,请参考以下文章

oracle 问题 如何修改glogin.sql

oracle sql 合并问题

SQL oracle的一些问题求解答

oracle sql变慢问题

oracle sql语句中的替换问题

oracle触发器中定时执行sql