Please start any new threads on our new
site at https://forums.sqlteam.com. We've got lots of great SQL Server
experts to answer whatever question you can come up with.
Author |
Topic |
vision.v1
Yak Posting Veteran
72 Posts |
Posted - 2011-03-28 : 07:04:04
|
Hi, Am new to SQL In my application i have two table1.#BonusApplicable 2.#tempCalendar want to find out whether bonus is applicable or not for a given range of dates so tried to update the table getting incorrect values: UPDATE a SET isBonusApplicable = b.isBonusApplicable FROM #tempCalendar a JOIN #BonusApplicable b ON a.bonusId = b.bonusID AND a.date >= b.effectiveDateTables Used in my application:IF OBJECT_ID('tempdb.dbo.#BonusApplicable') IS NOT NULLDROP TABLE #BonusApplicableCREATE TABLE #BonusApplicable( bonusId VARCHAR(10), effectiveDate DATETIME, isBonusApplicable VARCHAR(10))INSERT #BonusApplicable VALUES (1,'01/01/2010','Y')INSERT #BonusApplicable VALUES (1,'02/04/2010','N')INSERT #BonusApplicable VALUES (1,'01/01/2011','Y')INSERT #BonusApplicable VALUES (1,'01/18/2011','N')INSERT #BonusApplicable VALUES (1,'03/01/2011','Y')INSERT #BonusApplicable VALUES (2,'01/05/2010','Y')INSERT #BonusApplicable VALUES (3,'01/01/2010','Y')INSERT #BonusApplicable VALUES (3,'01/22/2010','N')INSERT #BonusApplicable VALUES (4,'03/15/2010','N')INSERT #BonusApplicable VALUES (2,'01/05/2011','N')INSERT #BonusApplicable VALUES (3,'01/01/2011','Y')INSERT #BonusApplicable VALUES (3,'01/22/2011','N')INSERT #BonusApplicable VALUES (4,'03/15/2011','Y')SELECT * FROM #BonusApplicable ORDER BY bonusId,effectiveDateIF OBJECT_ID('tempdb.dbo.#tempCalendar') IS NOT NULLDROP TABLE #tempCalendarCREATE TABLE #tempCalendar( date DATETIME, bonusId VARCHAR(10), isBonusApplicable VARCHAR(10))DECLARE @fromDate DATETIMEDECLARE @toDate DATETIME SET @fromDate = '01/15/2010'SET @toDate = '02/15/2010'DECLARE @date DATETIMESET @date = @fromDateWHILE @date <= @toDateBEGIN INSERT INTO #tempCalendar SELECT @date, a.bonusId, NULL isBonusApplicable FROM #BonusApplicable a JOIN ( SELECT bonusId, MAX(effectiveDate) effectiveDate FROM #BonusApplicable GROUP BY bonusId )b ON a.bonusId = b.bonusId AND a.effectiveDate = b.effectiveDate SET @date = @date + 1END SELECT * FROM #tempCalendar ORDER BY DATE,bonusId |
|
Ifor
Aged Yak Warrior
700 Posts |
Posted - 2011-03-28 : 07:51:53
|
You need to get the date range for each bonusId.Something like:;WITH OrderedBonusAS( SELECT bonusId, effectiveDate, isBonusApplicable ,ROW_NUMBER() OVER (PARTITION BY bonusId ORDER BY effectiveDate) AS RN FROM #BonusApplicable), BonusRangeAS( SELECT B1.bonusId ,B1.effectiveDate AS DateFrom ,COALESCE(B2.effectiveDate, '99991231') AS DateTo ,B1.isBonusApplicable FROM OrderedBonus B1 LEFT JOIN OrderedBonus B2 ON B1.bonusId = B2.bonusId AND B1.RN = B2.RN - 1)UPDATE CSET isBonusApplicable = R.isBonusApplicableFROM #tempCalendar C JOIN BonusRange R ON C.bonusId = R.bonusId AND C.[date] >= R.DateFrom AND C.[date] < R.DateTo |
 |
|
|
|
|
|
|