我试图在他/她成为付费会员之前计算一个人成为会员的平均时间。
我试图选择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))
答案 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,请关闭此主题:)