鑑於

2012-06-06 90 views
2

SQL Server的SUM函數我有一個領域一個觀點:鑑於

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

的價格計算值。

我想什麼是添加在SELECT語句中,將總結所有的價格與同一ID記錄給我結果的另一個計算列(totalPrice)(假設有視圖中的四排):

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

謝謝。

回答

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 

這是一個簡單得多


@伊萬-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) 

運行總計查詢不上2008的SQL工作: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不僅支持在分區窗口,它lso支持逐行打開窗口。 SQL Server 2008僅支持在分區上進行窗口化。所以@ ivan-83解決方案也可以工作。爲此,我upvote你的答案

+0

這就像一個魅力。很高興學習新的東西。謝謝。 – no9

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 
    . 
    . 
    . 
+0

我想ot將此列添加到現有的視圖(設計中) – no9

+0

@ no9你可以顯示視圖查詢嗎? –

+0

我編輯了這個問題。 – no9