2010-02-03 6 views
1

J'utilise cette requête pour obtenir ma date moyenne:Comment puis-je obtenir une date moyenne pondérée appropriée dans SQL

CONVERT(DATETIME, AVG(CONVERT(FLOAT, ChargeOffDate))) as [Average C/O Date] 

Ce qui me donne correctement la date '2003-08-12 14: 17: 22,103.

Lorsque j'utilise cette requête pour obtenir la date moyenne pondérée

CONVERT(DATETIME, SUM(CONVERT(FLOAT, ChargeOffDate) * FaceValue)/SUM(FaceValue)) 

Je reçois une date comme « 19/10/1938 21: 28: 48.000 » qui est loin de la date moyenne. J'ai l'impression que c'est une chose simple et qu'il me manque quelque chose de critique mais petit.

Exemple:

declare @temp table (value datetime, [weight] money) 
insert into @temp values (NULL,8850.00) 
insert into @temp values (NULL,137.91) 
insert into @temp values ('2006-01-15',221.13) 
insert into @temp values ('2006-10-15',127.40) 
insert into @temp values ('2001-07-31',551.44) 
insert into @temp values ('1997-10-12',4963.41) 
insert into @temp values ('2006-03-15',130.36) 
insert into @temp values ('2005-01-07',1306.31) 

SELECT 
    CONVERT(DATETIME, AVG(CONVERT(FLOAT, value))) as [Avg Date], 
    CONVERT(DATETIME, SUM(CONVERT(FLOAT, value) * [weight])/SUM([weight])) as [Weighted Avg Date] 
FROM @temp 

Cela donne '2003-11-25 20: 00: 00.000' comme Average Date et '13/10/1944 10: 52: 10,573' comme une moyenne pondérée. Sans les null, il donne '1999-12-02 17: 10: 51.087'. Il est possible que mon problème soit que les zéros rejettent mes calculs.

Répondre

2

Probablement, certains de vos ChargeOffDate sont NULL, mais leurs FaceValues ne le sont pas.

Ces enregistrements ne contribuent pas à la première somme, mais contribuent à la seconde.

WITH q (ChargeOffDate, FaceValue) AS 
     (
     SELECT CAST('20030101' AS DATETIME), 1.0 
     UNION ALL 
     SELECT CAST('20030201' AS DATETIME), 2.0 
     UNION ALL 
     SELECT CAST('20030301' AS DATETIME), 3.0 
     UNION ALL 
     SELECT NULL, 4.0 
     ) 
SELECT CONVERT(DATETIME, SUM(CONVERT(FLOAT, ChargeOffDate) * FaceValue)/SUM(FaceValue)) 
FROM q 

---- 
1961-11-12 21:36:00.000 

Utilisez ceci:

WITH q (ChargeOffDate, FaceValue) AS 
     (
     SELECT CAST('20030101' AS DATETIME), 1.0 
     UNION ALL 
     SELECT CAST('20030201' AS DATETIME), 2.0 
     UNION ALL 
     SELECT CAST('20030301' AS DATETIME), 3.0 
     UNION ALL 
     SELECT NULL, 4.0 
     ) 
SELECT CONVERT(DATETIME, SUM(CONVERT(FLOAT, ChargeOffDate) * FaceValue)/SUM(FaceValue)) 
FROM q 
WHERE ChargeOffDate IS NOT NULL 

---- 
2003-02-09 20:00:00.000