SQL如何通过不同的id进行条件求和?

时间:2011-05-11 22:18:00

标签: sql oracle select aggregate-functions

假设您有结果集,例如:

DATE          ID    cost    
---------------------------------------
 01/01/2011    1     10      
 01/01/2011    1     10      
 01/01/2011    2     10      
 01/01/2011    2     10      

我想要一种方法来对成本值进行求和,但对于每个不同的ID只需要一次,这样当我按日期分组时,我会得到一个结果,例如

DATE            cost

01/01/2011         20

我首先尝试了类似

的内容
    sum(distinct cost) 

但是诅咒只返回10 我也尝试过:

sum(case when distinct id then cost else 0 end)

但这不是功能性查询。

7 个答案:

答案 0 :(得分:17)

我会假设同一个ID在同一天总是会有相同的费用。我还假设您的RDBMS支持派生表。在这种情况下,这就是你想要的:

select date, sum(cost)
from 
  (select distinct date, id, cost from YourTable)
group by date

<强>更新

Oracle派生表不需要别名。

答案 1 :(得分:1)

我认为你想要做的就是按照日期和身份进行分组,正如MPelletier写的那样。

FWIW - 你可以在一些dbs中做一个不同的聚合内部: http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_sum

更好的是,使用group by with rollup获取总计以及分组: http://dev.mysql.com/doc/refman/5.0/en/group-by-modifiers.html

SELECT DATE, ID, SUM(cost)
FROM table_name
GROUP BY DATE, ID WITH ROLLUP;

答案 2 :(得分:1)

我认为发布问题的逻辑存在一些缺陷。

假设您有此结果集:

DATE          ID    cost    
---------------------------------------
 01/01/2011    1     10      
 01/01/2011    1     15     
 01/01/2011    2     10      
 01/01/2011    2     10      

查询应该返回什么?

DATE          cost    
---------------------------------------
 01/01/2011    20    

DATE          cost    
---------------------------------------
 01/01/2011    25   

接受的答案将返回35

或者是不可能拥有这样的一套?

答案 3 :(得分:0)

不知道数据库/ SQL引擎:

<击>     选择日期,总和(成本)     来自YourTable     GROUP BY日期,ID;

SELECT Date, First(TCost)
FROM
(SELECT Date, Sum(Cost) as TCost FROM YourTable GROUP BY Date, ID)
GROUP BY Date

答案 4 :(得分:0)

您可以使用此查询。

 SELECT dates, Sum(cost) as TCost FROM TABLE_NAME GROUP BY  ID

答案 5 :(得分:-1)

尝试这个

SELECT SUM(cost) AS Expr1
     , ID
     , date
 FROM (SELECT DISTINCT date
            , ID
            , cost
         FROM table_name AS table_name_1
        GROUP BY date, ID, cost) AS derivedtbl_1
 GROUP BY ID, date

或者这个

SELECT     SUM(cost) AS Expr1,  date
  FROM ( SELECT DISTINCT date, ID, cost
           FROM table_name AS table_name_1
           GROUP BY date, ID, cost) AS derivedtbl_1
 GROUP BY date

答案 6 :(得分:-2)

试试这个
我正在使用Mysql。 DEMO TABLE(表名是&#39; tablename&#39; .id和cost是&#39; int&#39;的类型)

id | cost  
 1 | 15  
 1 | 25  
 1 | 10  
 2 | 25  
 2 | 5  
 2 | 10  
 3 | 20    
 3 | 15    
 3 | 10    
 4 | 20    
 4 | 20   


查询使用

select id
     , SUM(cost) as 'Total Cost' 
  from sumchk 
 group by id  

或(在一个以下使用)

select id, sum(cost) as 'Total Cost'  
  from (select * 
          from tablename
  ) a  
group by id;

结果:

  id  |  Total Cost  
   1  |    50  
   2  |    40  
   3  |    45  
   4  |    40