4

我有一个字段视图:

typeId, type int
price, type decimal(15,4))

价格是计算值。

我想要的是totalPrice在 select 语句中添加另一个计算列 ( ),它将具有相同 id 的记录的所有价格相加,给出结果(假设视图中有四行):

typeId   price         totalPrice
1        10,000        30,000
1        15,000        30,000
1        5,000         30,000
2        10,000        10,000

谢谢你。

4

2 回答 2

4

假设您现有的视图名为 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 解决方案也有效。为此,我赞成你的回答

于 2012-06-06T11:57:17.147 回答
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
  .
  .
  .
于 2012-06-06T11:16:13.290 回答