http://oraqa.com/2008/02/01/how-to-solve-the-coin-combinations-puzzle-in-sql/
高人的
http://oraqa.com/author/frank-zhou/
发现一位专门用SQL解各种谜题的高人!
名字叫Frank Zhou, 似乎是中国人:
http://oraqa.com/author/frank-zhou/
最近OO发的几个趣味问题,他早就做过了。他写的SQL很对我的胃口,我准备陆续把一些有趣的问题转贴过来,比如这个:
http://oraqa.com/2008/02/01/how- ... ions-puzzle-in-sql/
Assuming you have enough coins of 1, 5, 10, 25 and 50 cents, how many ways are there to make change for a dollar?
用1分,5分,10分,25分,50分硬币凑成一元,总共有几种组合办法?
我用11GR2的写法:
WITH coins AS (
SELECT 1 cents FROM DUAL
UNION ALL SELECT 5 cents FROM DUAL
UNION ALL SELECT 10 cents FROM DUAL
UNION ALL SELECT 25 cents FROM DUAL
UNION ALL SELECT 50 cents FROM DUAL
)
,t(c1,c5,c10,c25,c50,cents,total_val) AS (
SELECT DECODE(c.cents,1,1,0)
,DECODE(c.cents,5,1,0)
,DECODE(c.cents,10,1,0)
,DECODE(c.cents,25,1,0)
,DECODE(c.cents,50,1,0)
,cents
,cents
FROM coins c
UNION ALL
SELECT c1 + DECODE(c.cents,1,1,0)
,c5 + DECODE(c.cents,5,1,0)
,c10+ DECODE(c.cents,10,1,0)
,c25+ DECODE(c.cents,25,1,0)
,c50+ DECODE(c.cents,50,1,0)
,c.cents
,t.total_val + c.cents
FROM t, coins c
WHERE t.total_val + c.cents<=100 AND t.cents<=c.cents
)
SELECT * FROM t WHERE total_val=100;
他的写法在11G通不过:
SELECT ltrim(max(str),',') combinations,
rtrim(ltrim(replace(max(str_num),',','+'),'+'),'+') Sum,
count(*) over () as counter
FROM
(SELECT sys_connect_by_path(str,', ') str, rownum rn,
translate(sys_connect_by_path(str_num,','),
chr(0)||'ABCDE',chr(0))||',' AS str_num
FROM
(SELECT str_num, str, to_number(substr(str_num,0,length(str_num)-1)) n,
substr(str_num,length(str_num)) coin_type
FROM
(SELECT LEVEL||'A' str_num , LEVEL||' Penny' AS str
FROM dual CONNECT BY LEVEL <=100
UNION ALL
SELECT LEVEL*5||'B' str_num, LEVEL||' Nickel'
FROM dual CONNECT BY LEVEL*5 <=100
UNION ALL
SELECT LEVEL*10||'C' str_num, LEVEL||' Dime'
FROM dual CONNECT BY LEVEL*10 <=100
UNION ALL
SELECT LEVEL*25||'D' str_num, LEVEL||' Quarter'
FROM dual CONNECT BY LEVEL*25 <=100
UNION ALL
SELECT LEVEL*50||'E' str_num, LEVEL||' Half D$'
FROM dual CONNECT BY LEVEL*50<=100
)
)
WHERE
CASE LEVEL
WHEN 1 THEN CASE WHEN n = 100 THEN 1 END
WHEN 2 THEN CASE WHEN n + PRIOR n =100 THEN 1 END
WHEN 3 THEN CASE WHEN CONNECT_BY_ROOT n + PRIOR n + n =100 THEN 1 END
ELSE 1 END =1
CONNECT BY PRIOR coin_type < coin_type
AND
CASE LEVEL
WHEN 2 THEN CASE WHEN n + PRIOR n <=100 THEN 1 END
WHEN 3 THEN CASE WHEN CONNECT_BY_ROOT n + PRIOR n + n <=100 THEN 1 END
WHEN 4 THEN CASE WHEN CONNECT_BY_ROOT n + PRIOR n + n <96 THEN 1 END
WHEN 5 THEN CASE WHEN CONNECT_BY_ROOT n + PRIOR n + n <=85 THEN 1 END
ELSE 1 END =1
)
CONNECT BY PRIOR rn = rn
AND INSTR(str_num,',', 1,LEVEL+1) > 0
AND PRIOR dbms_random.string('p',10) IS NOT NULL
GROUP BY rn
HAVING SUM(TO_NUMBER(SUBSTR(str_num,
INSTR(str_num,',', 1, LEVEL) + 1,
INSTR(str_num,',', 1, LEVEL+1) -
INSTR(str_num,',', 1, LEVEL) -1))) = 100 ;
WHEN 3 THEN CASE WHEN CONNECT_BY_ROOT n + PRIOR n + n <=100 THEN 1 END
*
ERROR at line 38:
ORA-30007: CONNECT BY ROOT operator is not supported in the START WITH or in the CONNECT BY condition
印象中只有某个版本允许在CONNECT BY条件中使用CONNECT_BY_ROOT。
发现一位专门用SQL解各种谜题的高人!
分享到:
相关推荐
sql 语言汇总!Sql Server语言 大全!!!
sql查询生成器!!!!!一个简单的软件,对学习Sql语句有很大帮助
SQL server的上机试验,应该会有用到的,希望会有人用到!!!!!!!!!!!!!!
sql练习题学习!!!
博客网!JSP sqlserver!博客网!JSP sqlserver!博客网!JSP sqlserver!博客网!JSP sqlserver!
SQL2000各种查询方法!
oracle 的rownum和咱们平时用的sqlserver的区别,其中好多的不一样!
包含多中数据库的SQL介绍,有兴趣的朋友可以看看啊
SQL数据库一周自学通,欢迎各位下载。!!!!!!!!!
学习SQL的看过来!!!24小时自学SQL(第四版)2008最新版.不仅适合初学者,也适合学过SQL的,是学习不错的一本参考资料!!
讲解编写SQL时遇到一些棘手情况、一些容易遗漏的注意点,通过各种案例讲解,提升SQL编写的规范性、SQL编写的完整性,能提升SQL编写的技巧和质量。
sqldb ,数据库连接工具,可以直接使用!
使用的SQL数据库 附加即可 使用ODBC连接 实现简单 适用初学者 !! 有java源码~~~~
本人在Windows7 64位+SQL Server 2012环境下测试通过(系统是全新安装) 使用方法: 1,安装SQLPrompt v5.3,这个不多说。 2,安装完毕后,断开网络连接。 3,打开Visual Studio或者SQL Server Management Studio(版本...
SQL与PL SQL讲座!!!
PL_SQL 安装文件 破解文件 PL_SQL是针对于Oracle数据库的一款客户端软件
2011-6-14 更新 :很多人说不能使用,估计是没有安装.NET FRAMEWORK2.0 或 2.0以上版本 的缘故。 1、所有窗口内容要“由上至下”的填写顺序。 阶段一:是将EXCEL文档中带有连接字段的超连接进行重写入EXCEL,以便于...
T-SQL查询逻辑谜题[归类].pdf
SQL SQLPrompt 9 SQL 2016/2017可用,带注册机,本人SQL2016,本人SQL2017完美使用!附破解教程
不错的一份SQL资料, 共享一下!