2011-01-22 6 views
3

Я По таблицеNull Расчет с SQL Select Заявление

Input   Output 
--------------------------------- 
12.22   
       2.22 

Если я прохожу После Sql заявление:

Выберите вход, выход, Баланс = сумма (Вход - Выход) из фондовой группы по входу , выход

Так выход есть:

Input   Output  Balance 
-------------------------------------- 
12.22   NULL   NULL 
NULL    2.22   NULL 

Если я хочу Выход, как показано ниже:

Input   Output  Balance 
-------------------------------------- 
12.22       12.22 
       2.22   10.00 

Чем является заявление SQL Transact?

Моя Структура таблицы, как показано ниже:

companyID int 
transID  int -- Primary Key (Auto Increment) 
Date  datetime 
particulars varchar 
input  decimal 
output  decimal 

Примечания: - Я применил здесь Group By функции на ввода и выводе колонн, которые не делают различие как есть ТрансИД колонна который является автоинкрементным, поэтому он должен отображать все строки таблицы.

+0

Похоже, вы хотите провести расчет итогов? Если да, то что вы заказываете? (Бит «NULL» прост - просто используйте «COALESCE») –

ответ

3

Я думаю, это может сработать для вас. Во-первых, вот как я определил мои испытания таблицы и тестовые данные:

declare @stock table (
    transId int not null identity(1,1), 
    [date] date not null, -- use datetime if not using SQL Server 2008 
    input decimal(7,2) null, 
    [output] decimal(7,2) null 
); 

insert into @stock values 
('1/23/2011', 12.22, null), 
('1/23/2011', null, 2.22), 
('1/24/2011', 16, null), 
('1/24/2011', 3.76, null), 
('1/24/2011', null, 5.50); 

А вот выбор я использовал для получения результатов, которые вы указали в своем вопросе. Запрос производит общую сумму для всех транзакций в заказе на идентификатор транзакции за данный день. Если вы хотите рассчитать общий итог в течение нескольких дней, тогда закомментируйте строку AND b.[date] = a.[date].

select 
    [date], 
    input = isnull(input,0), 
    [output] = isnull([output],0), 
    balance = (isnull(input,0)-isnull([output],0)) + 
     isnull((
      select 
      sum((isnull(input,0)-isnull([output],0))) 
      from @stock b 
      where b.transId < a.transId 
      and b.[date] = a.[date] -- comment this for totals over multiple dates 
     ),0) 
from @stock a 
order by transId; 

Этот запрос дает:

date  input output balance 
2011-01-23 12.22 0.00 12.22 
2011-01-23 0.00 2.22 10.00 
2011-01-24 16.00 0.00 16.00 
2011-01-24 3.76 0.00 19.76 
2011-01-24 0.00 5.50 14.26 

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

+0

Хорошее решение, хорошо сделанное – mahesh

2

Любая «нормальная» операция с нулевым значением дает нуль.

Отзыв о COALESCE; используйте тот факт, что COALESCE(foo, 0) возвращает foo, если он не равен нулю и возвращает 0, если foo - null.

3
Select Input, 
     Output, 
     @runbal:[email protected]+SUM(COALESCE(Input, 0) - COALESCE(Output, 0)) AS Balance 
from (select @runbal:=0) rt,Stock 
group by Input,Output 
+0

Маловероятно, что группировка на «Input, Output» правильная, вероятно, он хочет сохранить заказ даты транзакции. Я бы поднял это, если вы опустите сумму и группу. – Andomar

+0

@Martin. Здесь требуется переменная @runbal, но если мы создадим дополнительные столбцы bal1 для хранения оставшихся вычислений и после деления ввода и вывода. Является ли это возможным? – mahesh

+0

@Andomar - Я согласен, что этот запрос не имеет практического применения, но OP должен прояснить этот @mahesh. Можете ли вы расширить свой вопрос, чтобы рассказать нам о своей фактической схеме таблиц и добавить большее количество выборочных данных и желаемых результатов? Это дает вам желаемые результаты, но они, похоже, не имеют большого смысла, и теперь вы, кажется, меняете их в любом случае! –

0

Вот Sql-2000 сервер Решение я хочу поделиться с сообществом, которое находится недалеко от Решения arcain в:

Здесь я использую Coalesce Функции вместо ISNULL

select 
transID, 
input, 
output, 
runningtotal = coalesce(input,0)- coalesce(output,0) + 
coalesce(
(select 
sum(coalesce(input,0)-coalesce(output,0)) 
from stock b 
where b.transID < a.transID 
),0) 
from stock a 
order by transID 

Спасибо .......

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