【问题标题】:SQL Server: Sum values from multiple rows into one rowSQL Server:将多行中的值汇总为一行
【发布时间】:2015-10-27 17:32:05
【问题描述】:

我正在尝试对多行的值求和。例如:

我的输出是:

ID  Value
---------
1    3
1    4

我想看到的是:

ID  Value
---------
1   7

这是我的代码:

SELECT 
   id CASE sum(cast(value as float)) 
   WHEN 0 THEN [other_value] 
   else ISNULL([value] ,'') 
   end  AS 'Value'
FROM table1
WHERE id = 1
GROUP BY id

我在网上看到了一些解决方案,例如我必须包含 GROUP BY 以避免出现此错误:

在选择列表中无效,因为它既不包含在聚合函数中,也不包含在 GROUP BY 子句中

但是,还是没有。

注意: 值为varchar,因此,我需要cast

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    您只需要group by id 列。

    select id, sum(cast(value as numeric))
    from tablename
    group by id
    

    编辑:

    SELECT 
    id,
    sum (
    case when cast(value as numeric) = 0 THEN cast([other_value] as numeric) 
    else cast(ISNULL([value] ,0) as numeric)
       ) end 
    AS totalvalue
    FROM table1
    GROUP BY id
    

    【讨论】:

    • 由于某种原因,如果我不添加 group by id, value, other_value 将返回此错误:is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause. 就像查询真的希望我在 group by 中添加 valueother_value 跨度>
    • 您确定在答案中使用了查询吗?这是正在运行的完整查询吗?如果没有,请发布完整的查询
    • 如果没有group by子句,你不能使用SUM等聚合函数。
    • @vkp 你的意思是不要添加castcase
    • 您应该发布正在使用的完整查询。还有一些表格中的示例数据,所以我们不必猜测
    【解决方案2】:

    您正在尝试对字符串求和(即使您强制转换它) 只有当您的 ISNULL 变为 0 或某个数值时,查询才会起作用

    SELECT
    id, SUM(CASE WHEN CAST(value AS FLOAT) = 0
    THEN CAST([other_value] AS FLOAT)
    ELSE ISNULL([value], 0) 
    END) AS 'Value'
    FROM table1
    WHERE id = 1
    GROUP BY id
    

    【讨论】:

    • 如果 value 是一个 char 字符串,那么如果没有 else 中的强制转换,它也不应该工作。
    • Ja 但从外观上看,如果他必须强制转换以获得值,那么表设计首先是错误的,我必须设计一个表来测试他的查询 CREATE TABLE Table1 ( id INT, value VARCHAR(10), other_value VARCHAR(10)) INSERT INTO Table1 (id, value, other_value) VALUES (1, 0, 3) INSERT INTO Table1 (id, value, other_value) VALUES (1, 4, 0 )
    • 如果表看起来像这样,那么简化的代码将起作用 CREATE TABLE Table2 (id INT, value INT NOT NULL, other_value INT NOT NULL) INSERT INTO Table2 (id, value, other_value) VALUES (1 , 0, 3) INSERT INTO Table2 (id, value, other_value) VALUES (1, 4, 0) SELECT id, SUM(CASE WHEN value = 0 THEN [other_value] ELSE [value] END) AS 'Value' FROM Table2 WHERE id = 1 GROUP BY id
    【解决方案3】:

    如果你想要做的是得到 [value] 的每个 ID 的总和,如果非零,否则 [other_value]...这就是你需要的:

    select
        id,
        SUM(coalesce(nullif(cast([value] as float),0), cast([other_value] as float), 0)) [Value]
    from table1
    group by id
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-03-02
      • 2014-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-21
      • 2021-06-28
      相关资源
      最近更新 更多