微软面试题

[辅]《Oracle 行列转换的一道微软面试题》-相关代码

房东的猫 提交于 2019-12-01 11:15:40
注: 以下代码是为本博另一篇博文《 Oracle 行列转换的一首微软面试题 》服务的, 光看这代码是无意义的. /* 创建 sale 表, 并填充数据 数据库: Oracle 10g */ create table SALE ( ym CHAR(6), sale_amt NUMBER(14,2) ) tablespace USERS pctfree 10 initrans 1 maxtrans 255 storage ( initial 64K minextents 1 maxextents unlimited ); comment on column SALE.ym is '年月'; comment on column SALE.sale_amt is '销售金额'; alter table SALE disable all triggers; delete from SALE; commit; insert into SALE (ym, sale_amt) values ('200001', 1000); insert into SALE (ym, sale_amt) values ('200002', 1100); insert into SALE (ym, sale_amt) values ('200003', 1200); insert into SALE (ym,

Oracle 行列转换的一道微软面试题

北战南征 提交于 2019-11-30 06:11:25
昨天 fannairu 给的一个微软面试题, 写 SQL 来实现功能, 里面涉及到行列转换, 这算是 SQL 里一个比较好玩的功能了, 特将解题的思路记录下来. 题目: 现在一个商品销售表 sale , 表结构如下 想要转换成以下结构的数据 请用 Decode 实现.[微软公司 2004 年面试题] 解题思路: 1. 第一步: 数据准备 通过 这里 的 sql 语句创建 sale 表. 创建后的表数据如下 2. 第二步: 年月拆分 可以看到, 原有的数据结构里年月是在一起的, 即都是以 200001 来表示 2000年01月, 这里要使用 oracle 内建函数 substr 来将其析取出年、月来 执行 SQL select substr(t.ym, 1, 4) year, substr(t.ym, 5, 2) month, sale_amt from sale t 得以下结果 可以看到, 其年份与月份已经被拆分开来, 下一步将使用这个结果做为子查询进行行列转换. 3. 第三步: 行列转换 通过行列转换, 将以上结果转成按年/月列出的形式, 行列转换的要点在于: 使用 decode 得出需要得到的每一列的数据, 每列都使用一个 decode. 执行SQL select a.year year, decode(a.month, '01', a.sale_amt, 0) month01