WITH a AS
(SELECT 1 deptno, '部门一' deptname, '张三' NAME
FROM DUAL
UNION ALL
SELECT 1, '部门一', '李四'
FROM DUAL
UNION ALL
SELECT 1, '部门一', '王五'
FROM DUAL
UNION ALL
SELECT 2, '部门二', '赵六'
FROM DUAL
UNION ALL
SELECT 2, '部门二', '刘七'
FROM DUAL)
SELECT DECODE (ROW_NUMBER () OVER (PARTITION BY deptno ORDER BY deptname,
NAME),
1, deptno,
NULL
) deptno,
DECODE
(ROW_NUMBER () OVER (PARTITION BY deptno, deptname ORDER BY NAME),
1, deptname,
NULL
) deptname,
NAME
FROM a
(SELECT 1 deptno, '部门一' deptname, '张三' NAME
FROM DUAL
UNION ALL
SELECT 1, '部门一', '李四'
FROM DUAL
UNION ALL
SELECT 1, '部门一', '王五'
FROM DUAL
UNION ALL
SELECT 2, '部门二', '赵六'
FROM DUAL
UNION ALL
SELECT 2, '部门二', '刘七'
FROM DUAL)
SELECT DECODE (ROW_NUMBER () OVER (PARTITION BY deptno ORDER BY deptname,
NAME),
1, deptno,
NULL
) deptno,
DECODE
(ROW_NUMBER () OVER (PARTITION BY deptno, deptname ORDER BY NAME),
1, deptname,
NULL
) deptname,
NAME
FROM a
(SELECT 1 deptno, '部门一' deptname, '张三' NAME
FROM DUAL
UNION ALL
SELECT 1, '部门一', '李四'
FROM DUAL
UNION ALL
SELECT 1, '部门一', '王五'
FROM DUAL
UNION ALL
SELECT 2, '部门二', '赵六'
FROM DUAL
UNION ALL
SELECT 2, '部门二', '刘七'
FROM DUAL)
這個就相當於建表語句,並插入數據,也就是個臨時表吧
SELECT DECODE (ROW_NUMBER () OVER (PARTITION BY deptno ORDER BY deptname,
NAME),
1, deptno,
NULL
) deptno,
DECODE
(ROW_NUMBER () OVER (PARTITION BY deptno, deptname ORDER BY NAME),
1, deptname,
NULL
) deptname,
NAME
FROM a
這一部分就是用了分析函數分組查詢了
http://topic.csdn.net/u/20080521/12/16a9ea13-8160-4ef0-b7ed-be2e98f8c6ea.html
首先:WITH a AS
(SELECT 1 deptno, '部门一' deptname, '张三' NAME
FROM DUAL
UNION ALL
SELECT 1, '部门一', '李四'
FROM DUAL
UNION ALL
SELECT 1, '部门一', '王五'
FROM DUAL
UNION ALL
SELECT 2, '部门二', '赵六'
FROM DUAL
UNION ALL
SELECT 2, '部门二', '刘七'
FROM DUAL)
以上将你查出的信息放到a中,a可以理解一个结果集
以后的语句是在a结果集中查出你所需要的数据,避免使用了临时表
SELECT DECODE (ROW_NUMBER () OVER (PARTITION BY deptno ORDER BY deptname,
NAME),
1, deptno,
NULL
) deptno,
DECODE
(ROW_NUMBER () OVER (PARTITION BY deptno, deptname ORDER BY NAME),
1, deptname,
NULL
) deptname,
NAME
FROM a
原贴数据
deptno, deptname, name,
1 部门一 张三
1 部门一 李四
1 部门一 王五
2 部门二 赵六
2 部门二 刘七 用ROW_NUMBER () OVER (PARTITION BY deptno ORDER BY deptname,
NAME), 和ROW_NUMBER () OVER (PARTITION BY deptno, deptname ORDER BY NAME)相当于再生成两列
deptno, deptname, name, 编号1,编号2
1 部门一 张三 1 1
1 部门一 李四 2 2
1 部门一 王五 3 3
2 部门二 赵六 1 1
2 部门二 刘七 2 2
之所以编号二和编号一相同,是因他这里的数据同一deptno的没有不同deptname
也就是说没有以下这种情况,如果有的话,两个编号就不同了
deptno, deptname, name, 编号1,编号2
1 部门一 张三 1 1
1 部门一 李四 2 2
1 部门一 王五 3 3
1 部门二 赵六 4 1
1 部门二 刘七 5 2
然后用decode 一行行判断
如果编号1=1,输出显示deptno
不等于1的话,输出null
第二个DECODE,同理,只不过是输出deptname