2011-06-03 78 views
0

我有一个values表:如何编写排除总和查询?

+------------+---------+ 
| name  | value | 
+------------+---------+ 
| parameter1 | 53.8462 | 
| parameter2 | 7.6923 | 
| parameter3 | 23.0769 | 
| parameter4 | 15.3846 | 
+------------+---------+ 

什么是没有的第一个参数(parameter1)最后三个参数(parameter 2parameter 3parameter 4)的总和值的查询?

回答

1

这可能有点简单,但你不能做到这一点:

select sum(value) from table where name != 'parameter2'

如果你真的以后有什么是过去的第n个值的总和,你可以这样做(在SQL服务器):

WITH OrderedRows AS 
(
    SELECT name, value, 
    ROW_NUMBER() OVER (ORDER BY name) AS 'RowNumber' 
    FROM table 
) 
SELECT sum(value) 
FROM OrderedRows 
WHERE RowNumber > 1; 
2
SELECT SUM(value) tot 
FROM table 
WHERE name='parameter2' OR name='parameter3' OR name='parameter4' 

SELECT SUM(value) tot 
FROM table 
WHERE name<>'parameter1' 
1

如果您特异性这个只有

SELECT SUM(value) tot 
FROM table 
WHERE name<>'parameter1' 

,但如果你需要一些通用的解决方案比不使用此

1
select sum(value) from values where name!='parameter1'; 

代替的!你也可以使用<>。

+0

表中没有'name'列中的值为'parameter'的行。你的意思是'parameter1'? – 2011-06-03 08:21:12

1

一些空的检查,所以sum仍然可以正常工作:

SELECT SUM(coalesce(value, 0)) your_total 
FROM table 
WHERE coalesce(name, '') <> 'parameter1' 
1

如果您的目标是对最后三列进行求和,即使在比您的示例更大的表格上,您正在寻找移动窗口函数

甲骨文你可以写

WITH T AS (
    SELECT 'parameter1' PAR, 2 VAL FROM DUAL 
    UNION ALL 
    SELECT 'parameter2' PAR, 3 VAL FROM DUAL 
    UNION ALL 
    SELECT 'parameter3' PAR, 5 VAL FROM DUAL 
    UNION ALL 
    SELECT 'parameter4' PAR, 7 VAL FROM DUAL 
) 
SELECT PAR, SUM(VAL) OVER (ORDER BY PAR ROWS 2 PRECEDING) LAST3SUM FROM T; 

这将产生对

PAR  LAST3SUM 
---------- ---------- 
parameter1  2 
parameter2  5 
parameter3  10 
parameter4  15 

你shoudl看Oracle Documentation about Analytic Functions并牢记以下几点:

  • 注意查询使用SUM,但没有GROUP BY。这是因为我们不是汇总数据,而是计算我们选择的每一行的SUM
  • 请注意,订单是非常重要的,在我的示例中为I ORDER BY PAR,但您也可以通过查询中可用的其他列进行排序。

Oracle Data Warehousing Guide还讨论了窗口函数,给出了很多有用的例子。