获取CAST()的AVERAGE()

时间:2014-05-13 10:18:28

标签: sql sql-server-2008

我试图在他/她成为付费会员之前计算一个人成为会员的平均时间。

我试图选择ID - 创建日期 - 首次付款日期 - 创建和首次付款之间的时间 - 创建和首次付款之间的平均时间:

SELECT C.CompanyId, C.CreatedDate, CO.CreatedDate,
CAST(CO.CreatedDate - C.CreatedDate as int) AS 'Diff', FROM XXX.Company C
INNER JOIN -- some innerjoins--
WHERE -- Some conditions --

前四个选项工作正常。

ID  Date of creation        Date of first payment   'Diff'
1   2013-12-29 00:00:00.000 2014-01-10 18:34:18.000   13
2   2013-12-09 00:00:00.000 2014-01-10 21:07:29.000   33
3   2013-12-12 00:00:00.000 2014-01-10 21:14:01.000   30

我想将AVG(Diff)AS Average添加到我的选择查询

SELECT C.CompanyId, C.CreatedDate, CO.CreatedDate,
CAST(CO.CreatedDate - C.CreatedDate as int) AS 'Diff', AVG(CAST(Diff as int)) AS Average FROM XXX.Company C
INNER JOIN -- some innerjoins--
WHERE -- Some conditions --

其中包含"无效的列名"

我尝试将其更改为

SELECT C.CompanyId, C.CreatedDate, CO.CreatedDate,CAST(CO.CreatedDate - C.CreatedDate as int) AS 'Diff', AVG(CAST(CO.CreatedDate - C.CreatedDate as int)) AS Average  FROM XXX.Company C

这使得以下错误列在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中。

基本上,如何将我的CAST()的AVG()作为Diff?

我使用了DATEDIFF http://www.w3schools.com/sql/func_datediff.asp

DATEDIFF(DAY,C.CreatedDate,CO.CreatedDate) 为了删除不同的日期时间值,并获得差异 并在其周围使用AVG: AVG(DATEDIFF(DAY,C.CreatedDate,CO.CreatedDate))

4 个答案:

答案 0 :(得分:0)

您必须按某些值进行分组,以便让数据库知道avg的应用位置:

SELECT C.CompanyId
,      AVG(CAST(CO.CreatedDate - C.CreatedDate as int)) AS Average
FROM   XXX.Company C
GROUP
BY     C.CompanyId

此外,你的平均值和差异是冲突的,所以你必须禁用强制转换。

如果您希望在公司和两个日期创建的字段中分组所有行:

SELECT C.CompanyId
,      C.CreatedDate
,      CO.CreatedDate
,      CAST(CO.CreatedDate - C.CreatedDate as int) AS 'Diff'
,      AVG(CAST(CO.CreatedDate - C.CreatedDate as int)) AS Average
FROM   XXX.Company C
GROUP
BY     C.CompanyId
,      C.CreatedDate
,      CO.CreatedDate

答案 1 :(得分:0)

目前,您需要在CAST(...)内重复AVG(),即CAST() as Diff, AVG(CAST(...)) as Average.

您可以通过将CAST查询包装到内部派生表中来避免重复并将其干掉,然后将AVG聚合应用于此派生表,如下所示:

SELECT CompanyId, CreatedDate, CreatedDate, AVG(CAST(Diff as int)) AS Average 
FROM
(
   SELECT C.CompanyId, C.CreatedDate, CO.CreatedDate,
   CAST(CO.CreatedDate - C.CreatedDate as int) AS 'Diff'
   FROM XXX.Company C
   INNER JOIN -- some innerjoins--
   WHERE -- Some conditions --
) x;

答案 2 :(得分:0)

如果你只想要平均值:

SELECT AVG(CAST(CO.CreatedDate - C.CreatedDate as int)) AS Average FROM XXX.Company C ...

如果你想要平均 - 比如 - 每家公司:

SELECT C.CompanyId, AVG(CAST(CO.CreatedDate - C.CreatedDate as int)) AS Average FROM XXX.Company C ... GROUP BY C.CompanyId

如果你想创建一个n维"立方体"您可以使用分组集,按汇总分组或按立方分组分组的数据,如下所示:

SELECT C.CompanyId, AVG(CAST(CO.CreatedDate - C.CreatedDate as int)) AS Average FROM XXX.Company C ... GROUP BY cube(C.CompanyId)

答案 3 :(得分:0)

不知道如何将我的问题标记为已回答。 但我找到了解决方案:

我使用了DATEDIFF http://www.w3schools.com/sql/func_datediff.asp

DATEDIFF(DAY,C.CreatedDate,CO.CreatedDate),以便删除不同的日期时间值,并获得差异并使用AVG:AVG(DATEDIFF(DAY,C.CreatedDate,CO.CreatedDate))< / p>

mods,请关闭此主题:)