SQL Server SUM函数在视图中

时间:2012-06-06 11:09:50

标签: sql sql-server-2008 sum sql-view

我有一个带有字段的视图:

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

谢谢。

2 个答案:

答案 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
  .
  .
  .