Задавайте вопросы, мы ответим
Вы не зашли.
Уважаемые коллеги , возникла необходимость произвести некоторые манипуляции с БД .
Имеется таблица `rez`( `id` int(10) unsigned NOT NULL auto_increment,
`DT` timestamp NOT NULL default '0000-00-00 00:00:00',
`А int(10) unsigned NOT NULL,
`B` int(10) unsigned NOT NULL)
Встолбцы А,В постоянно поступают данные , причём в каждый момент времени один из столбцов равен нулю, а другой имеет некоторое числовое значение .
Требуется получить С=А-В , D=А/В. Причём , вполне допустимо чтобы С принимало отрицательное значение .
Значимой разницы нет в какой таблице будут формироваться эти значения , либо в имеющейся `rez` , либо в какой то другой .
Подскажите , как подобную идею реализовать .
Отредактированно Twix (29.02.2008 03:54:38)
Неактивен
Twix написал:
Уважаемые коллеги , возникла необходимость произвести некоторые манипуляции с БД .
Имеется таблица `rez`( `id` int(10) unsigned NOT NULL auto_increment,
`DT` timestamp NOT NULL default '0000-00-00 00:00:00',
`А int(10) unsigned NOT NULL,
`B` int(10) unsigned NOT NULL)
Встолбцы А,В постоянно поступают данные , причём в каждый момент времени один из столбцов равен нулю, а другой имеет некоторое числовое значение .
Требуется получить С=А-В , D=А/В. Причём , вполне допустимо чтобы С принимало отрицательное значение .
Значимой разницы нет в какой таблице будут формироваться эти значения , либо в имеющейся `rez` , либо в какой то другой .
Подскажите , как подобную идею реализовать .
Первую часть ( С=А-В ) , решил - через представление
create view rez_R as select cast (cast(A-B as unsigned) as signed) from rez .
Неактивен
Если один из столбцов равен нулю, то переменная D будет иметь мало смысла - либо 0 либо неопределенность (в последнем случае результат деления будет NULL). Можете просто добавить в определение VIEW A/B
CREATE OR REPLACE VIEW res_view AS SELECT CAST(A-B as signed) C, A/B D FROM res;
Неактивен
rgbeast написал:
Если один из столбцов равен нулю, то переменная D будет иметь мало смысла - либо 0 либо неопределенность (в последнем случае результат деления будет NULL). Можете просто добавить в определение VIEW A/B
Код:
CREATE OR REPLACE VIEW res_view AS SELECT CAST(A-B as signed) C, A/B D FROM res;
Это конечно , хорошо , но D=0 не устраивает .
Не много изменю порядок расчёта D .
If A=0 then
set D=1/B;
end if;
If B=0 then
set D=A/1;
end if;
If A>0 and B>0 then
set D=A/B;
end if;
Только вот проблемка , такое условие (на сколько я знаю ) можно отработать в триггере , а !!!! триггеры с вьюшкой не работают .
Или можно как нибудь по другому обойтись без представлений и триггеров ????
Неактивен
условие можно просто записать как выражение SQL (и использовать во VIEW)
SELECT IF(A=0, 1/B, IF(B=0, A, A/B)) D FROM res;
Неактивен
Попробывал я , написал табличку , прицепил к ней триггер , условие ( а вернее три
If A=0 then
set D=1/B;
end if;
If B=0 then
set D=A/1;
end if;
If A>0 and B>0 then
set D=A/B;
end if;
) только вот при отработке триггера, условия с нулём не отрабатывается и данные в соответствующих столбцах таблицы нет ???
rgbeast написал:
условие можно просто записать как выражение SQL (и использовать во VIEW)
Код:
SELECT IF(A=0, 1/B, IF(B=0, A, A/B)) D FROM res;
Попробую ВАШ вариант с вьюшкой .
Отредактированно Twix (01.03.2008 03:05:47)
Неактивен
Какой Вы триггер использовали BEFORE INSERT? Триггер надо тогда и на INSERT и на UPDATE создавать и вставлять все данные заново. Должен обрабатывать и нули и не нули. С VIEW проще будет решение.
Неактивен
rgbeast написал:
Какой Вы триггер использовали BEFORE INSERT? Триггер надо тогда и на INSERT и на UPDATE создавать и вставлять все данные заново. Должен обрабатывать и нули и не нули. С VIEW проще будет решение.
Использую триггеры INSERT & UPDATE , наверное где то накосячил . Надо будет "пристально " посмотреть .
А с вьюшкой обязательно попробую .
Неактивен
rgbeast написал:
...С VIEW проще будет решение.
БЛАГОДАРЮ !!!
ОК !!! С вьюшкой всё работает , а главное без геммороя ( два доп. триггера ).
Возникла необходимость , в продолжение развития имеющейся БД , вычислить соотношение D(-1)/D,
где D(-1) - некий параметр -1 период времени назад;
D - текущее значение параметра .
Подскажите как , реализовать подобную заморочку ???
Отредактированно Twix (03.03.2008 04:22:33)
Неактивен
Встроенной машины времени нет. Вы можете вручную по крону сохранять значения D в дополнительные таблицы.
Неактивен
rgbeast написал:
Встроенной машины времени нет. Вы можете вручную по крону сохранять значения D в дополнительные таблицы.
1. Значения рассчитываются во вьюшке , может быть ( т.к. вьюшка это своего рода запрос на запрос ) имеет смысл сохранить получаемые -рассчитываемые данные в базовой таблице ?
2. Могу ли я обратиться к предыдущему ( более раннему) значению параметра D, через id (auto_increment) ?
Отредактированно Twix (03.03.2008 14:19:12)
Неактивен
1. Возможно имеет смысл создать дополнительную таблицу, где хранить исторические данные
2. Обращаться к прошлому нельзя
Неактивен