Tsql Can';我不理解为什么使用强制转换错误而使用转换错误却不能?
执行时没有任何问题的以下代码:Tsql Can';我不理解为什么使用强制转换错误而使用转换错误却不能?,tsql,reporting-services,ssrs-2012,Tsql,Reporting Services,Ssrs 2012,执行时没有任何问题的以下代码: Select #ICDCodes.ICD_Code, #ICDCodes.Description, Count(#DiseaseIndex.VstIntID) AS 'Total Count', Sum(DATEDIFF(dd,#DiseaseIndex.AdmitDtSrt,#DiseaseIndex.DschrgDtTm )) as 'Total LOS', ISNULL(AVG(CONVERT(NUMERIC(8,2),DATEDIFF(DAY,#Dise
Select
#ICDCodes.ICD_Code,
#ICDCodes.Description,
Count(#DiseaseIndex.VstIntID) AS 'Total Count',
Sum(DATEDIFF(dd,#DiseaseIndex.AdmitDtSrt,#DiseaseIndex.DschrgDtTm )) as 'Total LOS',
ISNULL(AVG(CONVERT(NUMERIC(8,2),DATEDIFF(DAY,#DiseaseIndex.AdmitDtSrt,#DiseaseIndex.DschrgDtTm))),0) as 'Total Avg LOS'
FROM #DiseaseIndex LEFT JOIN #ICDCodes on #DiseaseIndex.VstIntID = #ICDCodes.VstIntID
WHERE ICD_Type IN ('P','S')
GROUP BY #ICDCodes.ICD_Code, #ICDCodes.Descriptio
但是这段代码抛出了一个错误:
SELECT
#ICDCodes.ICD_Code,
#ICDCodes.Description,
Count(#DiseaseIndex.VstIntID) AS 'Total Count',
Sum(CAST(DATEDIFF(dd,#DiseaseIndex.AdmitDtSrt,#DiseaseIndex.DschrgDtTm )AS NUMERIC(8,2))) AS 'Total LOS',
ISNULL(CAST(DATEDIFF(DAY,#DiseaseIndex.AdmitDtSrt,#DiseaseIndex.DschrgDtTm) AS NUMERIC(8,2)),0) as 'Total Avg LOS'
FROM #DiseaseIndex LEFT JOIN #ICDCodes on #DiseaseIndex.VstIntID = #ICDCodes.VstIntID
WHERE ICD_Type IN ('P','S')
GROUP BY #ICDCodes.ICD_Code, #ICDCodes.Description`
这是它产生的错误:
Msg 8120,第16级,状态1,第191行列“#DiseaseIndex.AdmitDtSrt”在选择列表中无效,因为它未包含在聚合函数或GROUP BY子句中 Msg 8120,第16级,状态1,第191行
列“#DiseaseIndex.DschrgDtTm”在选择列表中无效,因为它未包含在聚合函数或GROUP BY子句中 基本上,除了一组使用
CAST()
和另一组使用CONVERT()
有人能解释一下为什么CAST
需要将日期添加到groupby
语句中,而CONVERT
则不需要
提前感谢更新
在第二个查询中,您忘记了AVG
:
第一个问题:
为空(
平均值(
转换(数字(8,2),日期差(日,日,日,日,日,日,日,日,日,日,日,日,日,日,日,日,日,日,日,日,日,日,日,日,日,日,日,日,日,日,日,日,日,日,日,日,日,日,日,日,日,日,日,日,日,日,日,日,日,日,日,日,日,日,日,日,日
第二个问题:
ISNULL(将日期diff(DAY,#DiseaseIndex.AdmitDtSrt,#DiseaseIndex.dschrgdtm)转换为数字(8,2)),0)转换为“总平均服务水平”
第一版:
(这对于问题的第一个版本是正确的。)
这是因为在转换中使用数值(8,2)
,而在转换中使用十进制(8,2)
尽管numeric和decimal是可互换的同义词,但GROUPBY子句中有一个numeric,select子句中有一个decimal将导致该错误
下面是一个简单的演示:
DECLARE @T AS TABLE
(
col1 int,
col2 int
)
INSERT INTO @T VALUES
(1,1),(2,1),(3,1),
(4,2),(5,2),(6,2),
(7,3)
SELECT CAST(Col2 as NUMERIC(8,2)),
AVG(Col1)
FROM @T
GROUP BY CONVERT(DECIMAL(8,2), Col2)
结果:
1.00 2
2.00 5
3.00 7
列'@T.col2'在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中
但是,如果将select更改为十进制,或将group by更改为数字,则错误消息将消失,select将返回结果集:
SELECT CAST(Col2 as DECIMAL(8,2)),
AVG(Col1)
FROM @T
GROUP BY CONVERT(DECIMAL(8,2), Col2)
结果:
1.00 2
2.00 5
3.00 7
更新
在第二个查询中,您忘记了AVG
:
第一个问题:
为空(
平均值(
转换(数字(8,2),日期差(日,日,日,日,日,日,日,日,日,日,日,日,日,日,日,日,日,日,日,日,日,日,日,日,日,日,日,日,日,日,日,日,日,日,日,日,日,日,日,日,日,日,日,日,日,日,日,日,日,日,日,日,日,日,日,日,日
第二个问题:
ISNULL(将日期diff(DAY,#DiseaseIndex.AdmitDtSrt,#DiseaseIndex.dschrgdtm)转换为数字(8,2)),0)转换为“总平均服务水平”
第一版:
(这对于问题的第一个版本是正确的。)
这是因为在转换中使用数值(8,2)
,而在转换中使用十进制(8,2)
尽管numeric和decimal是可互换的同义词,但GROUPBY子句中有一个numeric,select子句中有一个decimal将导致该错误
下面是一个简单的演示:
DECLARE @T AS TABLE
(
col1 int,
col2 int
)
INSERT INTO @T VALUES
(1,1),(2,1),(3,1),
(4,2),(5,2),(6,2),
(7,3)
SELECT CAST(Col2 as NUMERIC(8,2)),
AVG(Col1)
FROM @T
GROUP BY CONVERT(DECIMAL(8,2), Col2)
结果:
1.00 2
2.00 5
3.00 7
列'@T.col2'在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中
但是,如果将select更改为十进制,或将group by更改为数字,则错误消息将消失,select将返回结果集:
SELECT CAST(Col2 as DECIMAL(8,2)),
AVG(Col1)
FROM @T
GROUP BY CONVERT(DECIMAL(8,2), Col2)
结果:
1.00 2
2.00 5
3.00 7
您可以发送完整的查询吗?提示:使用适当的软件(MySQL、Oracle、DB2等)和版本(例如,sql-server-2014
)标记数据库问题很有帮助。语法和特征的差异通常会影响答案。请注意,tsql
缩小了选择范围,但没有指定数据库。我已经编辑了我的答案。下次当有人要求你编辑帖子时,请让他们知道你是这样做的,并向他们发表了评论。你能发送完整的查询吗?提示:使用适当的软件(MySQL、Oracle、DB2等)和版本(如sql-server-2014
)标记数据库问题是很有帮助的。语法和特征的差异通常会影响答案。请注意,tsql
缩小了选择范围,但没有指定数据库。我已经编辑了我的答案。请,下次当有人要求你编辑一篇文章时,让他们知道你是这样做的,并给他们发了一条评论。我遵循这个逻辑,与类型转换保持一致是有道理的。但我不会在同一份报告中同时使用这两种方法。我必须将编码的版本分开:一个版本使用强制转换,另一个版本使用转换。好吧,除非您共享查询(或者更好,它的简化版本)和示例数据,否则我无法提供更多帮助…我遵循这一逻辑,与类型转换保持一致是有意义的。,但我在同一份报告中没有同时使用这两种方法。我必须将编码的版本分开:一个版本使用CAST,另一个版本使用CONVERT。好吧,除非您共享查询(或者更好,它的简化版本)和示例数据,否则我无法提供更多帮助。。。