【问题标题】:SQL Server SUM() for DISTINCT recordsDISTINCT 记录的 SQL Server SUM()
【发布时间】:2020-09-27 19:02:54
【问题描述】:

我有一个名为“Users”的字段,我想在该字段上运行 SUM() 以返回所有 DISTINCT 记录的总和。我认为这会起作用:

SELECT SUM(DISTINCT table_name.users)
FROM table_name

但它没有选择 DISTINCT 记录,它只是像我运行 SUM(table_name.users) 一样运行。

我必须怎么做才能只添加来自该字段的不同记录?

【问题讨论】:

    标签: tsql


    【解决方案1】:

    使用count()

    SELECT count(DISTINCT table_name.users)
    FROM table_name
    

    SQLFiddle demo

    【讨论】:

    • COUNT() 和 SUM() 根本不是一回事。 (我知道你认为他想要统计用户,但用户实际上可能是一个数字,你知道的。)
    • 我对 SQL 不够熟悉,无法知道它是否是“合适的”技术,但这真的很简单,而且效果很好。谢谢你:)
    • 我做了一些研究,并认为这是解决我问题的最佳方法。关于@KyleHale 的评论,用户字段的数据类型是字符串,我试图从该字段中选择不同的记录。由于 COUNT 聚合函数返回字段中所有记录的计数,并且 DISTINCT 关键字仅选择唯一记录,因此 COUNT(DISTINCT table_name.users) 的组合返回了我预期的确切结果 - 来自用户字段。再次感谢大家的帮助:)
    【解决方案2】:

    这段代码似乎表明 sum(distinct) 和 sum() 返回不同的值。

    with t as (
    select 1 as a 
    union all
    select '1'
    union all
    select '2'
    union all
    select '4'
    )
    
    select sum(distinct a) as DistinctSum, sum(a) as allSum, count(distinct a) as distinctCount, count(a) as allCount from t
    

    你真的有不明确的价值观吗?

    select count(1), users
    from table_name
    group by users
    having count(1) > 1
    

    如果不是,总和将是相同的。

    【讨论】:

      【解决方案3】:

      您可以在以下示例中亲眼看到 distinct 的作用。在这里,我创建一个具有重复值的子查询,然后对这些值进行不同的求和。

      select DistinctSum=sum(distinct x), RegularSum=Sum(x)
      from
      (
      
          select x=1
          union All
          select 1
          union All
          select 2
          union All
          select 2
      
      ) x
      

      你可以看到在这个例子中,distinct sum 列返回 3,regular sum 返回 6。

      【讨论】:

      • 但这仅在值为“索引”以使记录唯一时才有效。如果基于另一个 ID 值的每条记录的值不是唯一的怎么办?
      【解决方案4】:

      您可以使用子查询:

      select sum(users)
      from (select distinct users from table_name);
      

      【讨论】:

      • 这根本不是真的,自 SQL Server 2000 以来一直存在 SUM(DISTINCT)。请参阅 technet.microsoft.com/en-us/library/ms187810.aspx
      • 是的,我刚刚查过了。我已经删除了该声明。标准 SQL AFAIK 中的 SUM 不存在,仅适用于 COUNT。
      • 这不起作用。为了让它工作,你需要为结果声明 ID。
      • Eg/ Select * From (SELECT DISTINCT field, field2 FROM table) X
      【解决方案5】:
      SUM(DISTINCTROW table_name.something) 
      

      它对我有用(innodb)。

      描述 - “DISTINCTROW 忽略基于整个重复记录的数据,而不仅仅是重复字段。” http://office.microsoft.com/en-001/access-help/all-distinct-distinctrow-top-predicates-HA001231351.aspx

      【讨论】:

      • OP 在问题中指定了 TSQL(仅适用于 Microsoft SQL Server 和 Sybase),并且您已经说过您的答案适用于 Innodb(这是可能的 MySQL 查询引擎之一)并且您'已经提供了适用于 Microsoft Access 的文章的链接(这绝对与 MySQL 或原始 TSQL 问题无关)。
      • 在 MySQL 中,DISTINCTROW is a synonym for DISTINCT。在 SQL Server 中,它似乎根本不存在。我没有在 Access 中测试过。
      【解决方案6】:
      ;WITH cte
      as
        (
        SELECT table_name.users , rn = ROW_NUMBER() OVER (PARTITION BY users  ORDER BY users) 
                FROM table_name
        )
      SELECT SUM(users)
      FROM cte 
      WHERE rn = 1
      

      SQL Fiddle

      自己试试
      测试

      DECLARE @table_name  Table (Users INT );
      INSERT INTO @table_name Values (1),(1),(1),(3),(3),(5),(5);
      
      ;WITH cte
      as
        (
        SELECT users , rn = ROW_NUMBER() OVER (PARTITION BY users  ORDER BY users)
           FROM @table_name
        )
      SELECT SUM(users) DisSum
      FROM cte 
      WHERE rn = 1
      

      结果

      DisSum
      9
      

      【讨论】:

        【解决方案7】:

        如果情况难以在 sum 子句中编织“distinct”,通常可以在整个查询中添加一个额外的“where”子句 - 例如:

        select sum(t.ColToSum)
        from SomeTable t
        where (select count(*) from SomeTable t1 where t1.ColToSum = t.ColToSum and t1.ID < t.ID) = 0
        

        【讨论】:

          【解决方案8】:

          可能与 Trying to sum distinct values SQL

          根据Declan_K's answer

          先获取不同的列表...

          SELECT SUM(SQ.COST)
          FROM 
          (SELECT DISTINCT [Tracking #] as TRACK,[Ship Cost] as COST FROM YourTable) SQ
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2021-04-02
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-03-08
            • 1970-01-01
            • 2020-12-16
            相关资源
            最近更新 更多