2011-06-03 83 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還討論了窗口函數,給出了很多有用的例子。