以下の受注などの同じカテゴリのグループの合計行である計算列(持続)を追加したいとします。 SQL Serverでこれをどのように行いますか?SQLで特定の行の計算列を追加する方法
SalesOrder Amount Total(calculated)
100 10 25
100 15 25
101 20 45
101 25 45
102 30 65
102 35 65
以下の受注などの同じカテゴリのグループの合計行である計算列(持続)を追加したいとします。 SQL Serverでこれをどのように行いますか?SQLで特定の行の計算列を追加する方法
SalesOrder Amount Total(calculated)
100 10 25
100 15 25
101 20 45
101 25 45
102 30 65
102 35 65
自動的に維持される事前計算凝集を格納するために使用するのに最適な機構は、インデックス付きビューになり、それが永続化計算カラムを介して可能ではない(あなたが計算する計算カラムにスカラーUDFを使用することができ結果は残ることはありませんが、このような計算された列は一般に、RBAR評価を強制したり、並列処理をブロックしたりするため、パフォーマンスに悪影響を与えます。
CREATE VIEW dbo.AggregatedSales
WITH SCHEMABINDING
AS
SELECT SalesOrder,
SUM(Amount) AS Total
FROM dbo.YourTable
GROUP BY SalesOrder
GO
CREATE UNIQUE CLUSTERED INDEX UIX ON dbo.AggregatedSales(SalesOrder)
そして凝集体を予め考慮して算出して記憶します。クエリがビューに参加する必要があります。あらかじめ計算された集計が実際に使用され、実行時に再計算されないようにするには、NOEXPAND
ヒントを使用する必要があります。 SQL Serverの
CREATE TABLE #t (saleOrder int , amount int)
INSERT INTO #t VALUES
(100,10)
,(100,15)
,(101,20)
,(101,25)
,(102,30)
,(102,35)
SELECT *
,SUM(amount) OVER (PARTITION BY saleorder) as [total]
FROM #t
結果:
saleOrder | amount | total
==========================
100 | 10 | 25
100 | 15 | 25
101 | 20 | 45
101 | 25 | 45
102 | 30 | 65
102 | 35 | 65
これは実際には2005年以降に動作します。 –
グレート、ありがとう!スタックエクスチェンジのスピードはすごいです。 –
@el_kraken、この答えが役に立つ場合は、答えを受け入れてください。 – RGS