我有一个带有字段的视图:
typeId, type int
price, type decimal(15,4))
价格是计算值。
我想要的是在select语句中添加另一个计算列(totalPrice
),该列将对具有相同id的记录的所有价格求和给出结果(假设视图中有四行):< / p>
typeId price totalPrice
1 10,000 30,000
1 15,000 30,000
1 5,000 30,000
2 10,000 10,000
谢谢。
答案 0 :(得分:3)
假设您的现有视图名为TheSummary。将其重命名为x_TheSummary
创建一个带有重命名视图旧名称的新视图。
create view TheSummary as
select x.*, g.totalPrice
from x_TheSummary x
join
(
select typeId, sum(price) as totalPrice
from x_TheSummary
group by typeId
) as g on g.typeId = x.typeId
这样,您的新视图不会对依赖于旧视图名称的应用程序进行任何重大更改
顺便说一下,由于您使用的是SQL Server 2008,因此您也可以使用以下窗口查询,但上面的查询适用于不支持窗口的RDBMS。
create view TheSummary as
select x.*, sum(totalPrice partition by typeId) as totalPrice
from x_TheSummary x
这简单得多
@ ivan-83有一秒钟,我认为SQL Server 2008不支持对分区进行窗口化。我正在考虑这个在SQL 2008上不起作用的构造(运行总计),但它适用于SQL 2012.
SELECT i, sum(i) over(order by i) as rt
FROM (values(1),(9),(7),(6)) as x(i)
正在运行的总查询不适用于SQL 2008:http://www.sqlfiddle.com/#!3/d41d8/1539
它现在适用于SQL 2012:http://www.sqlfiddle.com/#!6/d41d8/111
输出:
| I | RT |
----------
| 1 | 1 |
| 6 | 7 |
| 7 | 14 |
| 9 | 23 |
总而言之,SQL Server 2012不仅支持分区窗口,还支持逐行窗口化。 SQL Server 2008仅支持对分区进行窗口化。所以@ ivan-83解决方案也有效。为此,我赞成你的回答
答案 1 :(得分:1)
select *, (select sum(price)
from view as v2
where v2.typeId = v1.typeId) as totalPrice
from view as v1
试试这个
.
.
.
dbo.SklepOcenjenaVrednost.StevilkaNarocila,
CAST(CASE dbo.CstPostavkaSklepa.DDVID WHEN 1
THEN dbo.CstPostavkaSklepa.CenaSkupajDDV * 1.085
WHEN 2 THEN dbo.CstPostavkaSklepa.CenaSkupajDDV * 1.2
ELSE dbo.CstPostavkaSklepa.CenaSkupajDDV END AS decimal(15, 4)) AS CenaPostavkeZDDV
, (select sum (CAST(CASE dbo.CstPostavkaSklepa.DDVID
WHEN 1 THEN dbo.CstPostavkaSklepa.CenaSkupajDDV * 1.085
WHEN 2 THEN dbo.CstPostavkaSklepa.CenaSkupajDDV * 1.2
ELSE dbo.CstPostavkaSklepa.CenaSkupajDDV END AS decimal(15, 4)))
from dbo.CstPostavkaSklepa as CstPostavkaSklepa2
where dbo.CstPostavkaSklepa.SklepID = CstPostavkaSklepa2.SklepID ) as CenaSklepaZDDV
FROM dbo.CstSklep INNER JOIN
dbo.ActiveProcess ON dbo.CstSklep.ProcID = dbo.ActiveProcess.Id INNER JOIN
dbo.CstPostavkaSklepa ON dbo.CstSklep.SklepID = dbo.CstPostavkaSklepa.SklepID INNER JOIN
.
.
.