2014-06-27 87 views
0

我有一個查詢返回當前和非當前項目的行。 目前的項目沒有價值 非經常項目確實有值SQL查詢 - 選擇一個總列

我需要我的查詢返回所有當前值和非經常項目的總價值:

樣品:

Name Status  Value 
KB  Current  0 
KB  Non-Current 5 
KB  Current  0 
KB  Non-Current 5 
KB  Non-Current 5 
KB  Current  0 
KB  Current  0 
KB  Current  0 
AN  Non-Current 5 
AN  Current  0 
AN  Non-Current 5 
AN  Current  0 
AN  Current  0 

我需要:

Name Status  Value TotalValue 
KB  Current  0  15 
KB  Current  0  15 
KB  Current  0  15 
KB  Current  0  15 
KB  Current  0  15 
AN  Current  0  10 
AN  Current  0  10 
AN  Current  0  10 

我已經試過

SELECT Name,Status,Value,(SELECT SUM(Value) 
FROM Table 

但顯然這總計所有的價值,而不是每名,如果我試圖GROUP BY Name然後我得到的錯誤,這返回超過1的值。

+0

如果目前的項目有沒有價值,那麼爲什麼,根據你的榜樣,他們有一個0值,爲什麼所有的非經常性項目15或10的總和?你是按名稱分組的嗎?沒有價值的 – stakx

+0

我的意思是0.15的KB,因爲這個名字的總數是10,AN是10,所以按名稱分組。 – user3219693

回答

2

這總計所有的值,而不是每名,如果我嘗試GROUP BY名稱

您可以使用SUMOVER clause

SELECT Name, Status, Value, 
     SumPerName = SUM(Value) OVER (PARTITION BY NAME) 
FROM Table 

Demo

(你的樣本數據不好,因爲所有的名字都是一樣的)

如果您確實想按Status進行分區(這會使您的示例數據更好),您只需將PARTITION BY NAME替換爲PARTITION BY Status即可。

如果你只想與Status='Current'記錄,你只需要應用WHERE

SELECT Name, Status, Value, 
     SumPerName = SUM(Value) OVER (PARTITION BY NAME) 
FROM Table 
WHERE Status = 'Current' 

編輯:在外部查詢中使用CTE和應用WHERE

WITH CTE AS 
(
    SELECT Name, Status, Value, 
     SumPerName = SUM(Value) OVER (PARTITION BY NAME), 
     Total = (SELECT SUM(Value) FROM Table1) 
    FROM Table1 
) 
SELECT * FROM CTE 
WHERE Status = 'Current' 

Demo(帶有包含兩個不同名稱的樣本數據)

+0

儘管如此,我只能返回當前項目,並與所有值的總和。 – user3219693

+0

@ user3219693:應用WHERE。我編輯了我的答案。如果你還想包括總和,你必須使用'TotalSum =(SELECT SUM(Value)FROM Table)' –

+0

但是當這個數字超過1時,這個數字會下降 – user3219693

0

TSQL提供窗口功能爲:

SELECT 
    Name 
    , Status 
    , Value 
    , SUM(Value) OVER (PARTITION BY Status) AS SumByStatus 
    , SUM(Value) OVER (PARTITION BY Name) AS SumByNAme 
    , SUM(Value) OVER() AS SumOverAllReturnedRows 
FROM T 

MSDN

我想你需要通過Status分區。你的例子有點令人困惑,因爲Name在任何地方都是一樣的,無論如何所有Status=Current的值都是0。

+0

它不會在**'SQL Server 2008' ** – Luv

+0

@Luv你是什麼意思具體?我在SQL Fiddle上嘗試過,所有的窗口函數在2008年都能很好地工作。想想我以前還在2008年使用過這樣的函數。 – KekuSemau

+0

@Luv - SQL Server 2008允許窗口聚合。 2012年添加功能,然後意味着ORDER BY也可以使用 –

0
select t1.[Name], t1.[Status], t1.[Value], t2.TotalValue 
from Table1 t1 
left join (select t.[Name],isnull(sum(t.[Value]),0) as TotalValue 
      from Table1 t 
      where t.[Status]='Non-Current' 
      group by [Name] 
      )t2 on t1.Name=t2.Name 
where t1.[Status]='Current' 

SQl Fiddle