Вычисление нуля с помощью оператора SQL Select - PullRequest
3 голосов
/ 22 января 2011

У меня есть следующая таблица

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-транзакции?

Структура моей таблицы ниже:

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

Примечание: - Я применил здесь Функция Group By для столбцов input и Output , которые не имеют значения, поскольку есть столбцы transID, которые являются автоинкрементными, поэтому должны отображаться все строки таблицы.

Ответы [ 4 ]

3 голосов
/ 22 января 2011
Select Input,
       Output,
       @runbal:=@runbal+SUM(COALESCE(Input, 0) - COALESCE(Output, 0)) AS Balance
from (select @runbal:=0) rt,Stock 
group by Input,Output
3 голосов
/ 24 января 2011

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

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

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

2 голосов
/ 22 января 2011

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

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

0 голосов
/ 29 января 2011

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

Здесь я использую Объединение Функция вместо 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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...