2016-01-21 4 views
-1

Я разрабатываю веб-приложение. В базе данных веб-приложения у меня есть таблица Daily, в которой я делаю записи ежедневно. скажем, у него есть 3 столбца A, B и C. У меня есть другая таблица с именем Monthly, в которой я храню те же значения A, B, C на ежемесячной основе. Теперь я хочу, чтобы, когда один месяц завершается, т.е. нет записей в ежедневной таблице, становится 30 или 31, тогда новая строка создается автоматически в ежемесячной таблице, значения A, B и C будут содержать сумму всех значений в таблице Daily соответствующие значениям A, B, C. Я хочу знать, как я могу это сделать с помощью SQL, и если нет, то какой способ это сделать?Как автоматически создавать строки в таблице после обновления другой таблицы

+2

Вы должны запланировать работу в первый день каждого месяца, чтобы суммировать ежедневные значения. Детали зависят от базы данных и системы, которую вы используете. –

+0

Как я могу добавить работу? –

+1

Как говорит @GordonLinoff, расписания работы зависят от базы данных, в которой вы работаете. Не могли бы вы рассказать нам, какую базу данных вы используете? –

ответ

0

ответ Гордон Линофф является, вероятно, хороший путь, в зависимости от вашей базы данных, операционной системы, языка программирования и т.д.

Другой способ заключается в создании «триггер» на Daily столе, который автоматически выполняет суммирование при строка в последний день месяца вставляется. Обратите внимание: триггеры сложны и могут усложнять обслуживание и тиражирование.

Я сделаю это немного более конкретным, чтобы упростить объяснение. Кроме того, детали синтаксиса будут зависеть от вашего конкретного выбора базы данных. Этот ответ будет использовать синтаксис PostgreSQL.

Вот ежедневный стол. Я добавил столбец, содержащий дату, и сделал его основным ключом.

CREATE TABLE daily 
(
    daily_date date NOT NULL, 
    a integer NOT NULL, 
    b integer NOT NULL, 
    c integer NOT NULL, 
    CONSTRAINT daily_pkey PRIMARY KEY (daily_date) 
); 

А вот Ежемесячная таблица:

CREATE TABLE monthly 
(
    monthly_date date NOT NULL, 
    a_sum integer NOT NULL, 
    b_sum integer NOT NULL, 
    c_sum integer NOT NULL, 
    CONSTRAINT monthly_pkey PRIMARY KEY (monthly_date) 
); 

Теперь мы создаем процедуру, которая должна вызываться, когда в последний раз в день строка месяца вставляется. В PostgreSQL это специальный тип, называемый триггерной функцией. Информация зависит от вашей базы данных.

CREATE OR REPLACE FUNCTION summarize_month() 
    RETURNS trigger AS 
$BODY$DECLARE 
    month_begin DATE := 
     make_date(
      cast (extract(year from new.daily_date) as integer), 
      cast (extract(month from new.daily_date) as integer), 
      1); 
    month_end DATE := 
     month_begin + interval '1 month' - interval '1 day'; 
BEGIN 
    INSERT INTO monthly(monthly_date, a_sum, b_sum, c_sum) 
    (SELECT month_begin, sum(a), sum(b),sum(c) 
    FROM daily 
    WHERE daily_date BETWEEN month_begin AND month_end); 
    return null; 

END;$BODY$ 
    LANGUAGE plpgsql VOLATILE 
    COST 100; 

Эта процедура выясняет начало и окончание даты месяца, чтобы быть суммированы, на основе daily_date ряда, который был только что вставлен. Затем он вставляет новую строку в таблицу monthly, содержащую обобщенные данные, вычисленные оператором SELECT.

Наконец, мы присоединяем функцию триггера к таблице daily и говорим ей, чтобы она выполнялась только при вставке строки последнего месяца месяца.

CREATE TRIGGER summarize_daily_to_monthly 
    AFTER INSERT 
    ON daily 
    FOR EACH ROW 
    WHEN ((date_part('month'::text, new.daily_date) <> 
     date_part('month'::text, (new.daily_date + 1)))) 
    EXECUTE PROCEDURE summarize_month(); 

Я знаю, что это длинный ответ на то, что звучит как простая проблема. Пожалуйста, не стесняйтесь спрашивать, нуждаетесь ли вы в дальнейшем разъяснении.

+0

спасибо .. Я попробую и дам вам знать –

Смежные вопросы