在Oracle 10g中透视表

时间:2014-07-25 07:09:19

标签: sql oracle

我有一个关于使用以下结构和数据来旋转表的查询

结构

列名数据类型
EMP_NAME VARCHAR2(30)

DT NUMBER(2,0)

PRESENT VARCHAR2(1)

EMP_NAME DT PRESENT

V   1   Y
V   2   Y
V   3   Y
V   4   Y
R   1   N
R   2   Y
R   3   Y
R   4   N
K   1   Y
K   2   Y
K   3   Y
K   4   N

我想调整此表格以显示左侧的名称,顶部的日期和中心的现在(更像是考勤表)。我从互联网上得到了一个代码,但那个dint真的对我很有帮助。请帮忙..

预期输出::

姓名1 2 3 4 5 6 7 8 9 10 11 12 .......

R y y n y ......

V n y y n ...... ......

K y y y y ....

名称数量可以增长,dt列的数据范围将为1-31。

提前致谢

的Vivek

1 个答案:

答案 0 :(得分:0)

这是解决方案,但您需要事先知道值的数量。 这里的假设是'Y'> 'N'。

另请注意,如果实际上表中缺少某些值,例如某些日期没有记录,那么 MAX 函数将返回null。然后,您应该使用 NVL 子句将其包围。

  select EMP_NAME
        ,max(a1) as a1
        ,max(a2) as a2
        ,max(a3) as a3
        ...
    from (select EMP_NAME
                ,decode(DT, '1', Present) as a1
                ,decode(DT, '2', Present) as a2
                ,decode(DT, '3', Present) as a3
                ...
            from test)
group by EMP_NAME
order by EMP_NAME;