2011-10-30 22 views
2
create proc sp_SumVirtual 
as 
    select a.year, sum(b.PriceDay*b.AmmountDays) profit 
    from vehicles a, rent b 
    where a.Matriculation = b.Matriculation 
    GROUP BY a.year 

これで私は車ごとに金額を得ましたが、全額が必要です。だから、私は仮想テーブルの利益からSUMを作ることができる方法はありますか?それが私が必要とするすべてのものですから、あるいは別の方法をお勧めしますか?TSQL - 選択内の仮想列にSUMを使用するにはどうすればよいですか?

+1

それは毎年どのくらいのことを伝えてくれるのでしょうか?各車のどれくらいではないのですか?ちょうど ' –

+0

これはプロセスの代わりにudfだったらこれは簡単でしょう? ProcsはTSQLの内部の結果を操作する痛みです –

答えて

1

はあなたGROUP BY句にWITH ROLLUPを使用します。yearの値と合計欄の値は、すべてのグループ化された行を超える総合計になりますよう

SELECT 
    a.year, SUM(b.PriceDay*b.AmmountDays) profit 
FROM 
    dbo.vehicles a 
INNER JOIN 
    dbo.rent b ON a.Matriculation = b.Matriculation 
GROUP BY 
    a.year WITH ROLLUP 

これは、あなたNULLと追加の行を与えます。

更新:したがって、合計年をすべての年のすべての行に渡って合計した別の列が必要ですか?

これを試してみてください:

SELECT 
    a.year, 
    SUM(b.PriceDay*b.AmmountDays) profit, 
    (SELECT SUM(b2.PriceDay * b2.AmountDays) 
    FROM dbo.vehicles a2 
    INNER JOIN dbo.rent b2 ON a2.Matriculation = b2.Matriculation) AS TotalProfit 
FROM 
    dbo.vehicles a 
INNER JOIN 
    dbo.rent b ON a.Matriculation = b.Matriculation 
GROUP BY 
    a.year 

をもつとも:これはは非常によく実行されません、あなたは何度も何度もTotalProfitを計算するので、 - 出力される行ごとに.....

+0

私はスペイン語以来、すべてが乱れてしまいました。そして、私はprocから多くのものを削除してシンプルにしなければなりませんでした。このprocについての必要性は私に利益の列の合計でNEW COLUMNを与えることです。大変ありがとうございます! BTW .. –

+0

サブクエリの代わりに "sum(b2.PriceDay * b2.AmountDays)over()"は簡単であり、より効果的でなければなりません – Alexey

0
Select v.year, Sum(r.PriceDay*r.AmmountDays) profit 
From vehicles v Join rent r 
    On r.Matriculation = v.Matriculation 
Group By v.year 
With RollUp 
0

あなたはUNION ALLと一緒に一時テーブルを使用することができます。

SELECT 
    a.year, SUM(b.PriceDay*b.AmmountDays) profit 
INTO #Temp 
FROM 
    dbo.vehicles a 
INNER JOIN 
    dbo.rent b ON a.Matriculation = b.Matriculation 
GROUP BY 
    a.year 

SELECT * 
FROM #Temp 

UNION ALL 

SELECT year, Sum(profit) 
FROM #Temp 
Group by year 
関連する問題