2015-03-29 1 views
1

Я создаю простую базу данных с данными, которые позволят мне (используя excel) проанализировать мой расход холодной воды, теплой воды, eletricity и т. Д. И взимать плату за них.Вычислительная колонка на основе другого вычисленного столбца в процедуре вставки

Я собираюсь использовать useforms в excel для вставки данных в базу данных, поэтому я создал процедуру SQL. Ниже приведен пример ввода данных для холодной воды.

Я перехожу к процедуре двух важных параметров: @Price и @Reading. В таблице [Холодная вода] У меня также есть столбцы: Потребление и стоимость.

Что я хочу сделать, это рассчитать сначала потребление для текущего месяца (как фактическое @Reading - предыдущее чтение). Затем, вычисляя текущее потребление, я хочу использовать это значение и рассчитать стоимость (текущее потребление * @Price).

Мне удалось вычислить текущее потребление и стоимость с помощью подзапроса. Но мне любопытно, может ли (и как это возможно) я могу напрямую использовать вычисленное значение, которое еще не было вставлено (текущее потребление), для вычисления другого (стоимости) внутри одной вставки вместо использования подзапроса.

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

Буду признателен за любые советы.

@Date  AS DATE, 
@Reading  AS DECIMAL (6,3), 
@Price  AS DECIMAL (6,2), 
@Unit AS VARCHAR (5) 

AS 
    BEGIN 
     SET NOCOUNT ON 


-- Cold water 
IF NOT EXISTS 
     (
     SELECT Date 
     FROM [Cold water] 
     WHERE Date = @Date 
     ) 
     BEGIN 
      INSERT INTO dbo.[Cold water] 
      (
       Date, 
       Year, 
       Month, 
       Day, 
       Reading, 
       Consumption, 
       Unit, 
       Price, 
       Cost 
      ) 
      VALUES 
      (
       @Date, 
       (SELECT YEAR(@Date)), 
       (SELECT MONTH(@Date)), 
       (SELECT DAY(@Date)), 
       @Reading, 
       (SELECT 
        (@Reading - (SELECT Reading FROM [Cold water] WHERE ID = (SELECT MAX(ID) FROM [Cold water])) 
        ) 
       ), 
       @Unit, 
       @Price, 
       (SELECT @Price* (SELECT (@Reading - (SELECT Reading FROM [Cold water] WHERE ID = (SELECT MAX(ID) FROM [Cold water]) 
                ) 
             ) 
           ) 
       ) 
      ) 
     END 
+0

Какая СУБД для этого? Добавьте тег, чтобы указать, используете ли вы 'mysql',' postgresql', 'sql-server',' oracle' или 'db2' - или что-то еще. –

+1

Я добавил - SQL Server. – kkris77

ответ

1

Вы можете делать то, что вы хотите использовать insert . . . select:

INSERT INTO dbo.[Cold water](Date, Year, Month, Day, Reading, 
          Consumption, Unit, Price, Cost) 
    SELECT @Date, YEAR(@Date), MONTH(@Date), DAY(@Date), @Reading, 
      c.Consumption, @Unit, @Price, @Price * c.Consumption 
    FROM (SELECT (@Reading - Reading) as Consumption 
      FROM [Cold water] 
      WHERE ID = (SELECT MAX(ID) FROM [Cold water]) 
     ) c; 

Некоторые комментарии:

  • Вы злоупотребляете вложенными выбирает. Они не нужны только для применения функции.
  • Вам не нужно хранить компоненты даты, если вы храните дату. Вот почему база данных содержит такие функции, как year() и month().
  • Расчет cost, вероятно, лучше всего выполнен в виде вычисленного столбца.

EDIT:

Вы можете добавить вычисляемые столбцы:

alter table dbo.[Cold water] add year as (year(date)); 

или:

alter table dbo.[Cold water] add cost as (unit * price); 

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

+0

Спасибо, этот ответ работает. Компоненты даты, которую я храню, только для того, чтобы увидеть, как она работает с Excel Power Pivot, потому что она не позволяет группировать даты по месяцам, дням и т. Д., Как это делает обычная сводная таблица, для каждого компонента даты нужны отдельные столбцы. Вы имеете в виду стоимость в качестве вычисленного столбца при создании таблицы? Не могли бы вы представить, как это должно выглядеть для этого случая? Можно ли использовать параметр @Price в качестве части этого вычисления при создании таблицы? Или я ошибаюсь? – kkris77

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

  • Нет связанных вопросов^_^