【问题标题】:Counting Different Types计数不同的类型
【发布时间】:2018-10-11 17:34:54
【问题描述】:

我有一个名为 Food 的表,其中包含 BoxNumber、Analyte 和 AnalyteVal 列。

我需要这些框中特定分析物的总和(ana1、ana3、ana4)。 我该怎么做呢?

原始数据:

(Integer)  (Varchar)  (Varchar)
BoxNumber | Analyte | AnalyteVal
1           ana1      5
1           ana2      6
1           ana3      2f
1           ana4      6
2           ana3      1
2           ana4      4
3           ana1      2
3           ana2      4f
3           ana3      NULL

结果应该是:

BoxNumber | AnalyteVal
1           11
2           5
3           2

我的尝试:

SELECT BoxNumer, 
       SUM(CAST(ISNUMERIC(AnalyteVal) AS DECIMAL(10,2))) AS [DesiredSum] 
  FROM Food 
 WHERE analyte IN ('ana1','ana3','ana4') 
 GROUP BY BoxNumber

【问题讨论】:

  • 您使用的是什么版本的 SQL Server?
  • @ZoharPeled Microsoft SQL Server 2008 R2 (SP2)
  • 对于其中包含非数字数据的AnalyteVal值,2f或4f,您是要解析出数字,还是忽略该值?
  • 忽略值​​pan>
  • 谷歌ISNUMERIC函数并阅读它的作用。不是你想的那样。

标签: sql sql-server tsql sql-server-2008-r2


【解决方案1】:

试试这个:

Select 
    BoxNumber, 
    sum(CAST(AnalyteVal AS DECIMAL(10,2))) as [DesiredSum] 
from Food 
where analyte in ('ana1','ana3','ana4') and ISNUMERIC(AnalyteVal)=1
group by BoxNumber

工作 SQLFiddle 示例here

【讨论】:

    【解决方案2】:

    我相信这应该可行:

    SELECT BoxNumber, 
    SUM(cast(AnalyteVal as int)) AS DesiredSum
    FROM Food 
    WHERE analyte in ('ana1', 'ana3','ana4')
    AND IsNumeric(AnalyteVal) = 1
    GROUP BY BoxNumber
    

    【讨论】:

      【解决方案3】:

      不用distinct

      select BoxNumber, sum(cast(AnalyteVal AS DECIMAL(10, 2))) as [DesiredSum] 
      from Food 
      where analyte in ('ana1','ana3','ana4') and
            isnumeric(AnalyteVal) = 1 
      group by BoxNumber;
      

      如果你有更高版本的 SQL Server,那么你可以使用try_convert() 代替

      select BoxNumer, sum(cast(AnalyteVal as DECIMAL(10, 2))) as [DesiredSum] 
      from Food 
      where analyte in ('ana1','ana3','ana4') and
            try_convert(int, AnalyteVal) is not null
      group by BoxNumber;
      

      【讨论】:

      • Yogesha,我正在迭代 224k 行。是否有一些进一步的错误捕获我可以添加以防止“将数据类型 varchar 转换为数字时出错”错误?我不确定是什么导致我的 AnalyteVal 色谱柱脱落。
      • @Brad... 您的明确对话可能会导致问题。所以,我建议删除cast() 函数。
      • @Yogesh,操作数数据类型 varchar 对 sum 运算符无效。
      • @Brad.. 使用cast()
      【解决方案4】:

      试试这个查询。

      SELECT boxnumber, 
             Sum(Cast(analyteval AS DECIMAL(10, 2))) AS [DesiredSum] 
      FROM   food 
      WHERE  analyte IN ( 'ana1', 'ana3', 'ana4' ) 
             AND analyteval NOT LIKE '%[^0-9]%' 
      GROUP  BY boxnumber; 
      

      或者这个……

      SELECT boxnumber, 
             Sum(Cast(analyteval AS DECIMAL(10, 2))) AS [DesiredSum] 
      FROM   food 
      WHERE  analyte IN (SELECT DISTINCT analyte 
                         FROM   food
                         WHERE  analyte <> 'ana2') 
             AND analyteval NOT LIKE '%[^0-9]%' 
      GROUP  BY boxnumber; 
      

      结果

      +-----------+------------+
      | boxnumber | DesiredSum |
      +-----------+------------+
      |         1 |         11 |
      |         2 |          5 |
      |         3 |          2 |
      +-----------+------------+
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-04-27
        • 1970-01-01
        • 2017-09-05
        • 2013-12-03
        • 1970-01-01
        • 1970-01-01
        • 2011-02-15
        • 1970-01-01
        相关资源
        最近更新 更多