以下代码执行时没有任何问题:
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
没有?
提前致谢
答案 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