SQL 强制转换和循环

Posted

技术标签:

【中文标题】SQL 强制转换和循环【英文标题】:SQL CAST AND ROUND 【发布时间】:2018-07-23 00:38:23 【问题描述】:

我创建了一个视图,它为字母等级分配一个数字,然后从两个值中获取平均值,然后需要将平均值四舍五入为 0 十进制值。 下面是我试图四舍五入的代码

   ROUND(CAST(AVG(CASE Result WHEN 'O' THEN 5 WHEN 'H' THEN 4 WHEN 'P' THEN 3 WHEN 'E' THEN 2 WHEN 'B' THEN 1 END) , COUNT(DISTINCT s.Area)) AS DECIMAL),0

当我使用上面的代码执行我的选择语句时,它会抛出错误提示 “'Cast' 附近的语法不正确,预期为 'As'”

我不确定我做错了什么。但我只是想得到一个平均值,然后将数字四舍五入为 0 个十进制值

样本数据:

s.area  Result
1            O
2            H
3            O
4            P

期望的结果: (总成绩)= 17/4 =4.25 然后 Round(4.25) = 4

问题现已解决。我用convert转换成十进制 平均值,然后我将数字四舍五入。谢谢大家的 帮助

【问题讨论】:

样本数据和期望的结果真的很有帮助。 count(distinct) 是什么?这两个值是什么? 【参考方案1】:

你给cast() 提供第二个参数——COUNT(DISTINCT s.Area)。这不是一种数据类型,更不用说预期的关键字AS。我不知道COUNT(DISTINCT s.Area) 应该在这里做什么?然而,为了得到一个四舍五入的小数,我建议像

round(avg(cast(CASE Result
                 WHEN 'O' THEN
                   5
                 WHEN 'H' THEN
                   4
                 WHEN 'P' THEN
                   3
                 WHEN 'E' THEN
                   2
                 WHEN 'B' THEN
                   1
              END)
          AS decimal),
      0)

【讨论】:

我已经用示例数据和想要实现的目标数据更新了我的问题【参考方案2】:

大概,你想要:

ROUND(AVG(CASE Result
             WHEN 'O' THEN 5.0
             WHEN 'H' THEN 4.0
             WHEN 'P' THEN 3.0
             WHEN 'E' THEN 2.0
             WHEN 'B' THEN 1.0
           END), 
      0)

如果您在case 中以十进制值开头,则不需要cast()。我不知道count(distinct) 应该是什么。也许那应该是另一个专栏。

【讨论】:

谢谢戈登。使用十进制值会有所帮助,但现在我想将结果四舍五入到小数点后 0 位。我正在做两列的平均值。一个是 case 语句,另一个是 Count ( Distinct s.area),我得到了我需要的正确值,但我现在需要对这个数字进行四舍五入。 AVG(CASE Result WHEN 'O' THEN 5.0 WHEN 'H' THEN 4.0 WHEN 'P' THEN 3.0 WHEN 'E' THEN 2.0 WHEN 'B' THEN 1.0 END) 作为整体,计数(DISTINCT s.AreaSeq) AS COUNT 给我一个值为 4.5 但我希望它显示为 5 @JaspreetSaini 。 . .这个答案包括round(),但我认为round() 不会四舍五入到 4.5 到 5。【参考方案3】:

AVG 用于取 1 列的平均值。如果您想取两列的平均值,只需将两列相加并除以 2。

【讨论】:

【参考方案4】:

您需要将 Round 环绕您的平均值,就像这样。缩进是可选的,我只是想在不同的层次上显示不同的部分。

With TestData as
(
Select 1 as Area, 'O' as Result
UNION ALL Select 2 as Area, 'H' as Result
UNION ALL Select 3 as Area, 'O' as Result
UNION ALL Select 4 as Area, 'P' as Result
)

Select 
  ROUND(
      AVG(
          CASE Result 
          WHEN 'O' THEN 5.0 
          WHEN 'H' THEN 4.0 
          WHEN 'P' THEN 3.0 
          WHEN 'E' THEN 2.0 
          WHEN 'B' THEN 1.0 
          END
      )
  , 0) AS OVERALL ,

    COUNT(DISTINCT Area) AS COUNT

From TestData

【讨论】:

以上是关于SQL 强制转换和循环的主要内容,如果未能解决你的问题,请参考以下文章

SQL SERVER中强制类型转换cast和convert的区别

SQL SERVER中强制类型转换cast和convert的区别

SQL SERVER中强制类型转换cast和convert的区别

访问 2000 - 强制转换规范 (#0) 的无效字符值 - 访问 SQL

Spark SQL:array_contains 和自动插入的强制转换

c和c++中,对结构体进行强制类型转换!