创建从其他表测量统计信息的过程。

时间:2014-01-03 02:53:47

标签: sql oracle plsql procedure

我有大学任务给我带来麻烦,我将引导您完成基本信息,以便您能够理解我的问题。

首先我有桌子:

CREATE TABLE Marriage (
       Id_Marriage        INTEGER,
       Marriage_date      DATE,
       Date_of_expiration DATE,
       Reason_of_expiration VARCHAR2(80)    
);

此表中的数据如下所示:

ID  Marriage_date  Date_of_expiration  Reason_of_expiration
1   39/04/12       94/11/16            Death 

然后我必须创建第二个表:

CREATE TABLE Statistics (
       Year                INTEGER, --(or date perhaps?)
       Number_of_marriages INTEGER,
       Number_of_divorces  INTEGER
);

我的工作是创建程序,这会在统计信息表中填充信息。因此,婚姻表中每年必须有多少婚姻和离婚(或婚姻结束)。可选地,它还可以在屏幕上打印数据以及将行插入到婚姻中。

我真的没有想出如何开始的想法。我想我需要某种光标,我知道我可以通过做这样的事情从日期中提取年份:

year := SUBSTR (marriage_Date, 1, 2);

除此之外,我什么都没有,所以任何帮助都得到了很大的帮助!

提前感谢所有参与者。

2 个答案:

答案 0 :(得分:2)

您不需要此程序。您可以使用以下查询

INSERT INTO STATISTICS
     SELECT to_number(to_char(marriage_date, 'YYYY')) YEAR,
            count(id_marriage) number_of_marriages,
            sum(CASE WHEN reason_of_expiration != 'Death' THEN 1
                     ELSE 0
                END) number_of_divorces
     FROM   marriage
     GROUP BY to_number(to_char(marriage_date, 'YYYY'));

希望它有所帮助。

答案 1 :(得分:1)

阅读你的问题我觉得最大的缺陷是没有必要创建一个程序,事实上,没有必要自己创建一个表!我想知道这是什么样的练习,除了数据库设计的基础知识,包括规范化之外,你还会学到其他一切。现实生活中的例子与此无关。

至于你的问题,因为没有人关心执行的细节,下面的代码就足够了:

CREATE OR REPLACE PROCEDURE calculateStatistics
IS
BEGIN
    DELETE FROM statistics;
    INSERT INTO statistics
         SELECT to_number(to_char(marriage_date, 'YYYY')) AS YEAR,
                count(id_marriage) as number_of_marriages,
                sum(CASE UPPER(reason_of_expiration)
                         WHEN  = 'DIVORCE' THEN 1
                         ELSE 0
                    END) number_of_divorces
         FROM   marriage
         GROUP BY to_number(to_char(marriage_date, 'YYYY'));
END;
/