Вычисление значений в базе данных

Работа VB и СУБД (Access, MSSQL, MySQL, Oracle и пр.)
Правила форума
При создании новой темы не забывайте указывать используемую СУБД.
dmitriy22
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 121
Зарегистрирован: 27.04.2006 (Чт) 12:04
Откуда: Москва

Вычисление значений в базе данных

Сообщение dmitriy22 » 25.08.2006 (Пт) 16:40

У меня возник такой вопрос:
У меня есть 2 таблице в SQL 2000 в одной есть столбец с значением X, а во второй таблице есть столбец с значением Y..... я хочу создать столбец в таблице вычисляемый значение Z, значение которого будет расчитываться по ф-ле Z=X+Н.... подскажите можно ли так делать?
и как ? :?
Я не волшебник, я просто учусь.

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 25.08.2006 (Пт) 16:50

BOL -> Create Table:
computed_column_expression

Is an expression defining the value of a computed column. A computed column is a virtual column not physically stored in the table. It is computed from an expression using other columns in the same table.


Т.е. нельзя. И вообще, с вычисляемыми столбцами больше геморроя, чем пользы. Если же тебе так это нужно, то сделай представление (View) или функцию (Function) и обращайся к нему/ней.

dmitriy22
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 121
Зарегистрирован: 27.04.2006 (Чт) 12:04
Откуда: Москва

Сообщение dmitriy22 » 25.08.2006 (Пт) 16:54

Ennor

а в Visual Basic можно ?
например через expression ???

или нельзя вычислить значение из двух таблиц, надо обязательно, чтобы оба вычисляемых столбца находились в одной таблице???
Я не волшебник, я просто учусь.

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 25.08.2006 (Пт) 16:56

dmitriy22 писал(а):а в Visual Basic можно ?

Эээ. Ты бы сначала определился, где у тебя твои таблицы - в SQL Server или в Visual Basic.

dmitriy22
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 121
Зарегистрирован: 27.04.2006 (Чт) 12:04
Откуда: Москва

Сообщение dmitriy22 » 25.08.2006 (Пт) 17:02

Ennor

вообще на SQL Server, но прога на VB вот я и думаю может через него как-то можно?
Я не волшебник, я просто учусь.

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 25.08.2006 (Пт) 17:08

dmitriy22 писал(а):прога на VB вот я и думаю может через него как-то можно?
Феерично. Ладно, попробую объяснить.

Посмотри внимательно на вот эту часть SQL-запроса и подумай, устроит она тебя или нет:
Код: Выделить всё
select T1.X + T2.Y
from Table1 T1
  inner join Table2 T2 on ...

Проще говоря, когда тебе нужно сложить (или еще что-либо вывести на их основе) столбцы, ты можешь сделать это непосредственно в запросе - в данном примере это сделано в select-части запроса.

dmitriy22
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 121
Зарегистрирован: 27.04.2006 (Чт) 12:04
Откуда: Москва

Сообщение dmitriy22 » 25.08.2006 (Пт) 17:13

Ennor

да в запрося я знаю, но у меня же таких не одна строчка...и что мне это загонять в цикл ? но как?
Я не волшебник, я просто учусь.

VVitafresh
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1641
Зарегистрирован: 12.05.2005 (Чт) 14:44
Откуда: Херсон, UA

Сообщение VVitafresh » 25.08.2006 (Пт) 19:14

dmitriy22, запрос который дал Ennor не нужно загонять в цикл, он и так вычисляет значения для ВСЕХ строк.
Никакую проблему невозможно решить на том же уровне, на каком она возникла. Нужно стать выше этой проблемы, поднявшись на следующий уровень.

dmitriy22
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 121
Зарегистрирован: 27.04.2006 (Чт) 12:04
Откуда: Москва

Сообщение dmitriy22 » 28.08.2006 (Пн) 11:47

еще вопрос:
а можно создать новый столбец и в свойстве FORMULA столбца написать допустим X+Y и тогда мы получаем сложение двух столбцов, ноя никак не найду какой там синтаксис, я просто хочу чтобы при вычитании любого числа выходил всегда положительный результат и для этого я хочу использовать модуль от разницы.....т.е. я пишу вот так... mod(X-Y) и он выдает ошибку ...неверен синтаксис, я уже все перерыл никак не найду ошибку??? :?
Я не волшебник, я просто учусь.

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 28.08.2006 (Пн) 12:26

% (Modulo)
Provides the remainder of one number divided by another.

Syntax
dividend % divisor

Examples
This example returns the book title number and any modulo (remainder) of dividing the price (converted to an integer value) of each book into the total yearly sales (ytd_sales * price).

Код: Выделить всё
USE pubs
GO
SELECT title_id,
   CAST((ytd_sales * price) AS int) % CAST(price AS int) AS Modulo
FROM titles
WHERE price IS NOT NULL and type = 'trad_cook'
ORDER BY title_id
GO

dmitriy22
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 121
Зарегистрирован: 27.04.2006 (Чт) 12:04
Откуда: Москва

Сообщение dmitriy22 » 28.08.2006 (Пн) 12:43

Konst_One по-моему это не совсем то.....это нужно забивать в свойство formula ???
Я не волшебник, я просто учусь.

dmitriy22
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 121
Зарегистрирован: 27.04.2006 (Чт) 12:04
Откуда: Москва

Сообщение dmitriy22 » 28.08.2006 (Пн) 13:40

понял... с помощью ABS можно выводить всегда положительное число....но как вычислять значения из разных таблиц...???....
надо ли триггер делать??? и как его лучше...можно даже сказать проще сделать?
Я не волшебник, я просто учусь.

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 28.08.2006 (Пн) 13:40

да, это я пример неудачный тебе привел.
а вообще в это поле для каждого столбца при создании таблицы ты можешь ввести вычисляемое значение, но оно будет работать только при добавлении записи в такую таблицу при значении по-дефолту для конкретного поля.

dmitriy22
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 121
Зарегистрирован: 27.04.2006 (Чт) 12:04
Откуда: Москва

Сообщение dmitriy22 » 28.08.2006 (Пн) 16:02

Konst_One примерчик бы какой-нить... :? :roll:
Я не волшебник, я просто учусь.

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 28.08.2006 (Пн) 16:19

какой пример, констрейнта что-ли :?:

ну вот:

Код: Выделить всё
ALTER TABLE [dbo].[SystemEvents] ADD
   CONSTRAINT [DF_SystemEvents_DateTime] DEFAULT (getdate()) FOR [DateTime],
   CONSTRAINT [DF_SystemEvents_Type] DEFAULT (1) FOR [Type],
   CONSTRAINT [DF_SystemEvents_Host] DEFAULT (host_name()) FOR [Host],
   CONSTRAINT [DF_SystemEvents_Code] DEFAULT (0) FOR [Code],
   CONSTRAINT [PK_SystemEvents] PRIMARY KEY  NONCLUSTERED
   (
      [EventID]
   )  ON [PRIMARY] ,
   CONSTRAINT [CK_SystemEventsType] CHECK ([Type] = 4 or ([Type] = 2 or [Type] = 1))
GO


Вернуться в Базы данных

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот и гости: 4

    TopList  
cron