假设您有结果集,例如:
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)
但这不是功能性查询。
答案 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