Невозможное задание по вычислению Sql, где дата равна - PullRequest
1 голос
/ 03 февраля 2011

**

СМОТРИТЕ НА МОЙ ОТВЕТ, КОТОРЫЙ ОТНОСИТСЯ К НОВОМУ ВОПРОСУ О ЖЕ ПРОБЛЕМЕ.

**

У меня путаница против использования Если, иначе Заявление против расчета запаса по дате. И сортировать то же самое по дате.

Существует реальная задача для вычисления промежуточного итога между равными датами:

  1. Если дата равна
  2. Если дата больше
  3. Если дата меньше

Схема моей таблицы:

TransID     int,        Auto Increment

Date       datetime,
Inwards decimal(12,2)
Outward decimal(12,2)

Предположим, если у меня есть записи ниже:

TransID Date(DD/MM/YYYY)  Inward        Outward     

1       03/02/2011                        100                                       
2       12/04/2010                        200               
3       03/02/2011          400                          

Чем должен быть результат:

    TransID Date(DD/MM/YYYY)    Inward  Outward        Balance

    2         12/04/2010                      200         -200          
    1         03/02/2011                      100         -300                                  
    3         03/02/2011            400                    100           

Я хочу вычислить Внутренний - наружу = Баланс и Счетчик балансов как Промежуточный итог , как указано выше. но при условии, что это должно быть в порядке даты по возрастанию

Как отсортировать и рассчитать его по дате и transID?

Что такое транзакционный SQL IN SQL_SERVER-2000 **?.

Ответы [ 4 ]

2 голосов
/ 03 февраля 2011

Вы можете использовать метод грубого O (n 2 ) самостоятельного соединения таблицы с самим собой, или, если таблица большая, лучше итеративно рассчитать баланс.Выбор для SQL Server 2000 ограничен, но в подходе, который я покажу, используется цикл, который пересекает таблицу в порядке date, transid, а не курсоры.

Вот пример таблицы для обсуждения

create table trans (transid int identity, date datetime, inwards decimal(12,2), outward decimal(12,2))
insert trans select '20110203', null, 100
insert trans select '20100412', null, 200
insert trans select '20110203', 400, null  -- !same date as first

Это пакет T-SQL, который даст вам требуемый вывод.Если вы просто хотели обновить столбец баланса в таблице (если у него был такой дополнительный столбец), измените все ссылки на #trans на саму таблицу.

-- fill a temp table with the new column required
select *, cast(null as decimal(12,2)) as balance
into #trans
from trans

-- create an index to aid performance
create clustered index #cix_trans on #trans(date, transid)

-- set up a loop to go through all record in the temp table
--   in preference to using CURSORs
declare @date datetime, @id int, @balance decimal(12,2)

select top 1 @date = date, @id = transid, @balance = 0
from #trans
order by date, transid

while @@ROWCOUNT > 0 begin
    update #trans set @balance = balance = @balance + coalesce(inwards, -outward)
    where transid = @id

    -- next record
    select top 1 @date = date, @id = transid
    from #trans
    where (date = @date and transid > @id)
       or (date > @date)
    order by date, transid
end

-- show the output
select *
from #trans
order by date, transid
;

-- clean  up
drop table #trans;

Выходные данные

2   2010-04-12 00:00:00.000 NULL    200.00  -200.00
1   2011-02-03 00:00:00.000 NULL    100.00  -300.00
3   2011-02-03 00:00:00.000 400.00  NULL    100.00

РЕДАКТИРОВАТЬ

Если вам нужно показать окончательный результат, используя дату в формате дд / мм / гггг, используйте эту

-- show the output
select transid, convert(char(10), date, 103) date, inwards, outward, balance
from #trans
order by #trans.date, transid
;
2 голосов
/ 03 февраля 2011

Баланс (внутренний-внешний)?

select TransID,
   Date,
  Inward,
  Outward, 
  (select sum(Inward - Outward) 
        from tbl_name b1 
        where b1.TransID <= b.TransID) as RunB 
 from   tbl_name b 
 order by Date desc,TransID desc

Это будет порядок по дате в порядке убывания - если даты совпадают, они упорядочены по TransID

Изменить:

Предположим, чтоТаблица транзакций как эта

select * from Transactions

1   NULL    100.00  2010-01-01 00:00:00.000
2   NULL    200.00  2010-01-02 00:00:00.000
3   400.00  NULL    2010-01-03 00:00:00.000
4   50.00   NULL    2010-01-03 00:00:00.000
5   NULL    100.00  2010-01-04 00:00:00.000

Если вы сделаете этот запрос, т.е. отсортируете по идентификатору транзакции, вы получите это!

select TransID,
   Date,
  isNull(Inward,0.0),
  isNull(Outward,0.0), 
  (select sum(isNull(Inward,0.0) - isNull(Outward,0.0)) 
        from Transactions b1 
        where b1.TransID <= b.TransID) as RunB 
 from  Transactions b 
 order by Date asc,TransID asc

1   2010-01-01 00:00:00.000 0.00    100.00  -100.00
2   2010-01-02 00:00:00.000 0.00    200.00  -300.00
3   2010-01-03 00:00:00.000 400.00  0.00    100.00
4   2010-01-03 00:00:00.000 50.00   0.00    150.00
5   2010-01-04 00:00:00.000 0.00    100.00  50.00

Вместо этого, если вы используете этот запрос - сортировка по дате вы получите это?Это то, что ты имел в виду, Махеш?

select TransID,
   Date,
  isNull(Inward,0.0),
  isNull(Outward,0.0), 
  (select sum(isNull(Inward,0.0) - isNull(Outward,0.0)) 
        from Transactions b1 
        where b1.Date <= b.Date) as RunB 
 from  Transactions b 
 order by Date asc,TransID asc

1   2010-01-01 00:00:00.000 0.00    100.00  -100.00
2   2010-01-02 00:00:00.000 0.00    200.00  -300.00
3   2010-01-03 00:00:00.000 400.00  0.00    150.00
4   2010-01-03 00:00:00.000 50.00   0.00    150.00
5   2010-01-04 00:00:00.000 0.00    100.00  50.00

Разница в запросах: -> (b1. Дата <= b.Date) и (b1. <strong>TransID <= b.TransID) </p>

0 голосов
/ 05 февраля 2011

Возьмите этот первый бит решения Cyberkiwi:

select *, cast(null as decimal(12,2)) as balance
into #trans
from stock

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

Учитывая структуру, которую вы указали в исходном вопросе, она может выглядеть следующим образом:

select
  TransID,
  convert(datetime, substring(Date,7,4) + substring(Date,4,2) + substring(Date,1,2)) as Date,
  Inward,
  Outward,
  cast(null as decimal(12,2)) as balance
into #trans
from stock

Оставьте остальную часть сценария нетронутой.

0 голосов
/ 04 февраля 2011

Теперь это решение с датой в формате дд / мм / гггг вышеуказанного вопроса.

select *, cast(null as decimal(12,2)) as balance
into #trans
from stock

-- create an index to aid performance
create clustered index #cix_trans on #trans(date, transid)

--set up a loop to go through all record in the temp table
--   in preference to using CURSORs
declare @date datetime, @id int, @balance decimal(12,2)

select top 1 @date = date, @id = transid, @balance = 0
from #trans
order by date, transid

while @@ROWCOUNT > 0 begin
  update #trans set @balance = balance = @balance + coalesce(input, -output)
  where transid = @id

-- next record
select top 1 @date = date, @id = transid
from #trans
where (date = @date and transid > @id)
or (date > @date)
order by date, transid
end

-- show the output
select 
transID,
date= convert(varchar,convert(datetime,date,103),103), 
input, 
output, 
balance
from #trans
order by convert(datetime,date,103), transID

-- clean  up
drop table #trans;
...