创建Oracle SQL用户定义的报告表

时间:2016-01-06 21:22:31

标签: plsql oracle-sqldeveloper

我有3个表格REPORTTBL1OFFICESLANGUAGES,他们的关系如下图所示。 relationships。现在我想创建一个表(或存储过程),其中X轴为OFFICES.OFFICE_ID,y轴为LANGUAGES.LANGUAGE_ID,每个单元格表示特定语言的使用次数办公室(例如,在莫斯科办公室使用中文的次数,或者在下面更好地描述)。

enter image description here

我只想要特定时间段的数据。我写的程序是

    create procedure procedure1 (
cursor_ out sys_refcursor)as
    begin
open cursor_ for
    SELECT 
            lng.language "Language", 
            sum(decode( off.office_id, 1, 1, 0)) Moscow, 
            sum(decode( off.office_ID, 2, 1, 0)) "New York", 
            sum(decode( off.office_ID, 3, 1, 0)) "Tel Aviv",    
            sum(decode( off.office_ID, 1, 1, 0) 
            + decode( off.office_ID, 2, 1, 0) 
            + decode( off.office_ID, 3, 1, 0) 
            ) Total 
        FROM Offices off, Languages lng, reporttbl1 rep 
        WHERE off.Office_ID = rep.Office_ID (+) AND rep.language_id = lng.language_id --(+) AND rep.language_id !=0 and rep.language_id is not null 
        AND rep.ticket_date BETWEEN '5-DEC-2015' AND '5-JAN-2015' 
        GROUP BY LNG.LANGUAGE 
        ORDER BY lng.language;
    end;

但它似乎不起作用。它不会在上图中选择并显示我想要的正确数据。有人可以让我知道怎么做吗?我更喜欢Oracle SQL,但SQL Server也可以。如果您需要更多信息,请与我们联系。

1 个答案:

答案 0 :(得分:1)

您可以使用out存储过程运行查询。但是,您的日期比较可能会导致问题,您需要应用to_date函数,如rep.ticket_date BETWEEN to_date('05-DEC-2015', 'DD-MON-YYYY') AND to_date('05-JAN-2015', 'DD-MON-YYYY'),除非rep.ticket_date的类型为char / varchar。