无法理解为什么使用CAST错误但使用CONVERT却没有?

时间:2018-03-08 21:44:07

标签: 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,#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,Level 16,State 1,Lines 191
  专栏'#DiseaseIndex.AdmitDtSrt'在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中。

     

Msg 8120,Level 16,State 1,Lines 191
  专栏'#DiseaseIndex.DschrgDtTm'在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中。

基本上它是相同的代码,但一组使用CAST()而另一组使用CONVERT()

有人可以解释为什么CAST需要在GROUP BY语句中添加日期而CONVERT没有?

提前致谢

1 个答案:

答案 0 :(得分:3)

更新

在第二个查询中,您忘记了AVG

第一个查询:     ISNULL( AVG( CONVERT(NUMERIC(8,2),DATEDIFF(DAY,#DiseaseIndex.AdmitDtSrt,#DiseaseIndex.DschrgDtTm)) ,0) as 'Total Avg LOS

第二个查询:

ISNULL(CAST(DATEDIFF(DAY,#DiseaseIndex.AdmitDtSrt,#DiseaseIndex.DschrgDtTm) AS NUMERIC(8,2)),0) as 'Total Avg LOS'

第一版:

(这对于问题的第一个版本是正确的。)

这是因为您在NUMERIC(8,2)中使用convert,在DECIMAL(8,2)中使用cast

虽然数字和小数是documented是可互换的同义词,但在group by子句中包含数字并在select子句中包含小数将引发该错误。

这是一个简单的演示:

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)

结果:

  

专栏' @ T.col2'在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中。

但是,如果将select更改为decimal或将group更改为numeric,则错误消息将消失,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

See a live demo on rextester