Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 И снова вставляем пропущенные значения  [new]
londinium
Member

Откуда: Киев
Сообщений: 1199
Итак, есть
Microsoft SQL Server 2008 (SP2) - 10.0.4000.0 (Intel X86)   Sep 16 2010 20:09:22   Copyright (c) 1988-2008 Microsoft Corporation  Enterprise Edition on Windows NT 5.2 <X86> (Build 3790: Service Pack 2) 
и таблица
IF OBJECT_ID(N'tempdb..#DebugSaldo',N'U') IS NOT NULL
  DROP TABLE tempdb..#DebugSaldo;

CREATE TABLE #DebugSaldo
(
  AgreeID     INT NOT NULL,
  Payments   MONEY NOT NULL,
  StartSaldo  MONEY NOT NULL,
  EndSaldo    MONEY NOT NULL,
  SaldoDate   DATE  NOT NULL
)  
INSERT #DebugSaldo(AgreeID,Payments,StartSaldo,EndSaldo,SaldoDate)
 VALUES(106818,0,10576.90,10576.90,'20100226'),
           (106818,100,10576.90,10476.90,'20100517'),
           (106818,1900,10476.90,8576.90,'20100922'),
           (106818,100,8576.90,8476.90,'20101008'),
           (106818,100,8476.90,8376.90,'20110211');
Задача нужно вставить все пропущенные значения даты, причем значения сальдо надо получить на максимальную дату, которая меньше вставляемой, т.е. должно получится
INSERT #DebugSaldo(AgreeID,Payments,StartSaldo,EndSaldo,SaldoDate)
 VALUES(106818,0,10576.90,10576.90,'20100226'),
            (106818,0,10576.90,10576.90,'20100227') <-вставляемое значение
...........................................................
            (106818,0,10576.90,10576.90,'20100516')<-вставляемое значение
            (106818,100,10576.90,10476.90,'20100517')<-уже есть в таблице
            (106818,100,10476.90,10476.90,'20100518')<-вставляемое значение
            
и т.д
Таблицу-календарь я получаю таким запросом(он не оптимален и т.д, но для отладки подходит):
DECLARE @InMinDate DATE;
SELECT @InMinDate=MIN(SaldoDate) FROM #DebugSaldo;

IF OBJECT_ID(N'tempdb..#Calendar',N'U') IS NOT NULL
  DROP TABLE tempdb..#Calendar;

CREATE TABLE #Calendar
(
  StartDate DATE
); 
WITH DAYS(D) AS
(
  SELECT @InMinDate
   UNION ALL 
  SELECT DATEADD(DD,1,D) FROM DAYS WHERE D<CAST(GETDATE()AS DATE) 
) 
INSERT #Calendar(StartDate)SELECT D FROM DAYS OPTION (MAXRECURSION 0)


DROP TABLE #Calendar;
DROP TABLE #DebugSaldo;
22 май 11, 23:41    [10691561]     Ответить | Цитировать Сообщить модератору
 Re: И снова вставляем пропущенные значения  [new]
Начинающий SQL 2008
Member

Откуда:
Сообщений: 438
londinium,

???

IF OBJECT_ID(N'tempdb..#DebugSaldo',N'U') IS NOT NULL DROP TABLE #DebugSaldo;
CREATE TABLE #DebugSaldo (AgreeID INT NOT NULL, Payments MONEY NOT NULL, StartSaldo MONEY NOT NULL, EndSaldo MONEY NOT NULL, SaldoDate DATE NOT NULL)  
INSERT #DebugSaldo(AgreeID,Payments,StartSaldo,EndSaldo,SaldoDate) VALUES(106818,0,10576.90,10576.90,'20100226'),
(106818,100,10576.90,10476.90,'20100517'),(106818,1900,10476.90,8576.90,'20100922'),(106818,100,8576.90,8476.90,'20101008'),
(106818,100,8476.90,8376.90,'20110211');

select * from #DebugSaldo order by SaldoDate


DECLARE @InMinDate DATE;
SELECT @InMinDate=MIN(SaldoDate) FROM #DebugSaldo;

IF OBJECT_ID(N'tempdb..#Calendar',N'U') IS NOT NULL DROP TABLE #Calendar;
CREATE TABLE #Calendar (StartDate DATE); 
WITH DAYS(D) AS (SELECT @InMinDate  UNION ALL SELECT DATEADD(DD,1,D) FROM DAYS WHERE D<CAST(GETDATE()AS DATE)) 
INSERT #Calendar(StartDate)SELECT D FROM DAYS OPTION (MAXRECURSION 0)

select a.StartDate, t.AgreeID, t.Payments, t.StartSaldo, t.EndSaldo
from #Calendar a
cross apply (select top 1 * from #DebugSaldo d where d.SaldoDate <= a.StartDate order by SaldoDate desc) t

DROP TABLE #Calendar;
DROP TABLE #DebugSaldo

24 май 11, 18:08    [10702051]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить