ALTER FUNCTION FnGetDDMMYY (@FROM_DT DATETIME,@TO_DT DATETIME)RETURNS @TAB_DAYS TABLE(DD BIGINT, MM BIGINT,YY BIGINT)AS BEGINWHILE @FROM_DT <=@TO_DTBEGIN INSERT INTO @TAB_DAYS SELECT DAY(@FROM_DT),MONTH(@FROM_DT),YEAR(@FROM_DT) SET @FROM_DT = DATEADD(DD,1,@FROM_DT)ENDRETURNEND
CREATE TABLE PHONEBILL(BILL_NBR BIGINT IDENTITY(1,1), FROM_DT DATETIME, TO_DT DATETIME, BILL_AMOUNT NUMERIC(16,5))INSERT INTO PHONEBILLSELECT '01/05/2012','02/04/2012',1500UNIONSELECT '02/05/2012','03/04/2012',1500UNIONSELECT '03/05/2012','04/04/2012',1500UNIONSELECT '04/05/2012','05/04/2012',1500UNIONSELECT '05/05/2012','06/04/2012',1500UNIONSELECT '06/05/2012','07/04/2012',1500UNIONSELECT '07/05/2012','08/04/2012',1500
BILL_NBR DD MM YY BILL_AMOUNT_PERDAY1 5 1 2012 481 6 1 2012 481 7 1 2012 481 8 1 2012 481 9 1 2012 481 10 1 2012 481 11 1 2012 481 12 1 2012 481 13 1 2012 481 14 1 2012 481 15 1 2012 481 16 1 2012 481 17 1 2012 481 18 1 2012 481 19 1 2012 481 20 1 2012 481 21 1 2012 481 22 1 2012 481 23 1 2012 481 24 1 2012 481 25 1 2012 481 26 1 2012 481 27 1 2012 481 28 1 2012 481 29 1 2012 481 30 1 2012 481 31 1 2012 481 1 2 2012 481 2 2 2012 481 3 2 2012 481 4 2 2012 48
SELECT p.BILL_NBR ,dtr.DD ,dtr.MM ,dtr.YYYY ,p.BILL_AMOUNT / (DATEDIFF(DAY,p.FROM_DT, p.TO_DT) + 1) AS BILL_AMOUNT_PERDAY FROM PHONEBILL AS pCROSS APPLY (SELECT DAY(DayDT) AS DD, MONTH(DayDT) AS MM, YEAR(DayDT) AS YYYY FROM (SELECT TOP (DATEDIFF(DAY,p.FROM_DT, p.TO_DT) + 1) DATEADD(DAY, ROW_NUMBER() OVER (ORDER BY object_id) - 1, p.FROM_DT) DayDT FROM sys.columns) AS r ) dtr
SELECT TOP (1000000) IDENTITY(INT,0,1) AS NINTO dbo.TallyTableFROM sys.columns c1, sys.columns c2 CREATE UNIQUE CLUSTERED INDEX IDX_TallyTable_N ON dbo.TallyTable(N ASC)
SELECT p.BILL_NBR ,dtr.DD ,dtr.MM ,dtr.YYYY ,p.BILL_AMOUNT / (DATEDIFF(DAY,p.FROM_DT, p.TO_DT) + 1) AS BILL_AMOUNT_PERDAY FROM PHONEBILL AS pCROSS APPLY (SELECT DAY(DayDT) AS DD, MONTH(DayDT) AS MM, YEAR(DayDT) AS YYYY FROM (SELECT TOP (DATEDIFF(DAY,p.FROM_DT, p.TO_DT) + 1) DATEADD(DAY, N, p.FROM_DT) DayDT FROM dbo.TallyTable) AS r ) dtr