SQL查询 - 使用总列选择

时间:2014-06-27 08:43:28

标签: sql-server-2008 tsql

我有一个返回当前和非当前项的行的查询。 当前项目没有价值 非当前项目具有值

我需要查询返回所有当前值和非当前项的总值:

样品:

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的值。

3 个答案:

答案 0 :(得分:2)

  

如果我尝试GROUP BY Name

,则总计所有值而不是每个名称

您可以将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'

new Demo (包含两个不同名称的示例数据)

答案 1 :(得分: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。

答案 2 :(得分: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