2

一時テーブルを使用して顧客の平均負荷を合計し、これらの新しい値で顧客テーブルを更新したいと考えています。単一の更新などを実行できますが、セットとして更新したいのですが、「サブクエリが複数の値を返しました。コードの 2 番目のブロックからサブクエリが続く場合、これは許可されません (#tcAvgs のすべての値は問題ありません。

create table #tcAvgs
(
    AccNo varchar(10) COLLATE SQL_Latin1_General_CP1_CI_AS,
    AvgFrame float,
    AvgValue float,
    AvgJobs float 
)
INSERT INTO #tcAvgs (AccNo, AvgFrame, AvgValue, AvgJobs)
SELECT t.accno, ROUND(t.TFrame/t.ccount ,2),ROUND(t.TValue/t.ccount , 2), ROUND( t.CCount/6 ,2)
FROM #tcTotals t


UPDATE c
SET c.AvgFrames = a.AvgFrame,
    c.AvgJobs = a.AvgJobs,
    c.AvgValue = a.AvgValue
FROM customers c join #tcAvgs a on c.AccountNo = a.AccNo 

私はそれを行うためのさまざまな方法を見てきましたが、それらはすべて同じエラーを出すようです。弾丸を噛んで一時テーブルをループして個々の更新を行う必要があるかどうか疑問に思っていますか? 複数の更新を実行する SQL の機能について、何か基本的なことが欠けています (多くの単一の更新ではありますが)。

正しい方向へのプッシュをいただければ幸いです。

4

2 に答える 2

1

この回答は、トリガーが @Andrew Bickerton と @marc_s によって提供された解決策を妨げていることを発見した人のみを対象としています (元は私も ^^)

DECLARE @Counter INT
DECLARE @AccNo varchar(10)
DECLARE @AvgFrames float
DECLARE @AvgJobs float
DECLARE @AvgValue float

SET @Counter = 1
WHILE @Counter <= (SELECT COUNT(*) FROM #tcAvgs)
BEGIN
    --update variables
    SELECT @AccNo = t.AccNo, @AvgFrames = t.AvgFrame, @AvgJobs = t.AvgJobs, @AvgValue = t.AvgValue 
    FROM #tcAvgs t
    WHERE t.Id = @Counter

    UPDATE customers
    SET AvgFrames = @AvgFrames,
        AvgValues = @AvgValue,
        AvgJobs = @AvgJobs
    WHERE AccountNo = @AccNo

    SET @Counter = @Counter + 1
END
于 2012-11-28T10:55:57.860 に答える
0

取得しているエラーは、#tcAvgs テーブルに一致する行が複数あることを SQL Server が訴えているため、顧客の行に設定する値がわからないことです。

実行する場合:

create table #tcAvgs
(
    AccNo varchar(10) COLLATE SQL_Latin1_General_CP1_CI_AS,
    AvgFrame float,
    AvgValue float,
    AvgJobs float 
)
INSERT INTO #tcAvgs (AccNo, AvgFrame, AvgValue, AvgJobs)
SELECT t.accno, ROUND(t.TFrame/t.ccount ,2),ROUND(t.TValue/t.ccount , 2), ROUND( t.CCount/6 ,2)
FROM #tcTotals t

SELECT c.AccountNo, COUNT(a.AccountNo) as NumRows
FROM customers c join #tcAvgs a on c.AccountNo = a.AccNo 
GROUP BY c.AccountNo
HAVING COUNT(a.AccountNo) > 1

問題の原因となっているレコードが見つかります。私の推測では、それは次のとおりです。

INSERT INTO #tcAvgs (AccNo, AvgFrame, AvgValue, AvgJobs)
SELECT t.accno, ROUND(t.TFrame/t.ccount ,2),ROUND(t.TValue/t.ccount , 2), ROUND( t.CCount/6 ,2)
FROM #tcTotals t

次のようにする必要がある場合があります。

INSERT INTO #tcAvgs (AccNo, AvgFrame, AvgValue, AvgJobs)
SELECT t.accno, AVG(ROUND(t.TFrame/t.ccount ,2)),AVG(ROUND(t.TValue/t.ccount , 2)), AVG(ROUND( t.CCount/6 ,2))
FROM #tcTotals t
GROUP BY t.accno
于 2012-11-28T10:30:29.287 に答える