我有一个返回当前和非当前项的行的查询。 当前项目没有价值 非当前项目具有值
我需要查询返回所有当前值和非当前项的总值:
样品:
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 :(得分:2)
如果我尝试GROUP BY Name
,则总计所有值而不是每个名称
您可以将SUM
与OVER
clause:
SELECT Name, Status, Value,
SumPerName = SUM(Value) OVER (PARTITION BY NAME)
FROM Table
(由于所有名称相同,您的样本数据都很糟糕)
如果您确实希望按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
我认为您需要按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 强>