2014-06-27 88 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