SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 29.02.2008 02:41:36

Twix
Завсегдатай
Зарегистрирован: 21.02.2008
Сообщений: 88

"Простая" арифметика

Уважаемые коллеги , возникла необходимость произвести некоторые манипуляции с БД .
Имеется таблица `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)

Неактивен

 

#2 29.02.2008 03:58:52

Twix
Завсегдатай
Зарегистрирован: 21.02.2008
Сообщений: 88

Re: "Простая" арифметика

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  .

Неактивен

 

#3 29.02.2008 11:00:04

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: "Простая" арифметика

Если один из столбцов равен нулю, то переменная 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;

Неактивен

 

#4 01.03.2008 02:00:12

Twix
Завсегдатай
Зарегистрирован: 21.02.2008
Сообщений: 88

Re: "Простая" арифметика

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;

Только вот проблемка , такое условие (на сколько я знаю ) можно отработать в триггере , а !!!! триггеры с вьюшкой не работают .

Или можно как нибудь по другому обойтись без представлений и триггеров  ????

Неактивен

 

#5 01.03.2008 02:55:54

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: "Простая" арифметика

условие можно просто записать как выражение SQL (и использовать во VIEW)

Код:

SELECT IF(A=0, 1/B, IF(B=0, A, A/B)) D FROM res;

Неактивен

 

#6 01.03.2008 03:03:39

Twix
Завсегдатай
Зарегистрирован: 21.02.2008
Сообщений: 88

Re: "Простая" арифметика

Попробывал  я , написал табличку , прицепил к ней триггер , условие ( а вернее три
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)

Неактивен

 

#7 01.03.2008 03:18:07

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: "Простая" арифметика

Какой Вы триггер использовали BEFORE INSERT? Триггер надо тогда и на INSERT и на UPDATE создавать и вставлять все данные заново. Должен обрабатывать и нули и не нули. С VIEW проще будет решение.

Неактивен

 

#8 01.03.2008 03:33:44

Twix
Завсегдатай
Зарегистрирован: 21.02.2008
Сообщений: 88

Re: "Простая" арифметика

rgbeast написал:

Какой Вы триггер использовали BEFORE INSERT? Триггер надо тогда и на INSERT и на UPDATE создавать и вставлять все данные заново. Должен обрабатывать и нули и не нули. С VIEW проще будет решение.

Использую триггеры INSERT & UPDATE , наверное где то накосячил . Надо будет "пристально " посмотреть .

А с вьюшкой обязательно попробую .

Неактивен

 

#9 03.03.2008 04:21:45

Twix
Завсегдатай
Зарегистрирован: 21.02.2008
Сообщений: 88

Re: "Простая" арифметика

rgbeast написал:

...С VIEW проще будет решение.

БЛАГОДАРЮ !!!
ОК !!! С вьюшкой всё работает , а главное без геммороя ( два доп. триггера ).

Возникла необходимость , в продолжение развития имеющейся БД , вычислить соотношение D(-1)/D,
где D(-1) - некий параметр -1 период времени назад;
D - текущее значение параметра .

Подскажите как , реализовать подобную заморочку ???

Отредактированно Twix (03.03.2008 04:22:33)

Неактивен

 

#10 03.03.2008 10:49:41

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: "Простая" арифметика

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

Неактивен

 

#11 03.03.2008 13:56:45

Twix
Завсегдатай
Зарегистрирован: 21.02.2008
Сообщений: 88

Re: "Простая" арифметика

rgbeast написал:

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

1. Значения рассчитываются во вьюшке , может быть ( т.к. вьюшка это своего рода запрос на запрос ) имеет смысл сохранить получаемые -рассчитываемые данные в базовой таблице ?
2. Могу ли я обратиться к предыдущему ( более раннему) значению параметра D, через id (auto_increment) ?

Отредактированно Twix (03.03.2008 14:19:12)

Неактивен

 

#12 03.03.2008 15:05:44

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: "Простая" арифметика

1. Возможно имеет смысл создать дополнительную таблицу, где хранить исторические данные
2. Обращаться к прошлому нельзя

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson