4

私はフィールドを持つビューを持っています:

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

価格は計算値です。

私が望むのは、別の計算列 ( totalPrice) を select ステートメントに追加することです。これにより、同じ ID を持つレコードのすべての価格が合計され、結果が得られます (ビューに 4 つの行があると仮定します)。

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 に答える