問題

私はそれにジョブのリストを持っているビューを持っています。誰に割り当てられているのか、ステージにあるようなデータがあります。ストアドプロシージャを作成して、各ステージにいくつのジョブがあるかを返す必要があります。

これまで私はこれを持っています(簡略化):

 DECLARE @ResultTable table 
(
  StaffName nvarchar(100),
  Stage1Count int,
  Stage2Count int
)

INSERT INTO @ResultTable (StaffName, Stage1Count)
  SELECT StaffName, COUNT(*) FROM ViewJob
  WHERE InStage1 = 1
  GROUP BY StaffName

INSERT INTO @ResultTable (StaffName, Stage2Count)
  SELECT StaffName, COUNT(*) FROM ViewJob
  WHERE InStage2 = 1
  GROUP BY StaffName
 

その問題は、行が結合されないことです。したがって、スタッフメンバーがstage1とstage2にジョブを持っている場合、@ResultTableには2つの行があります。私が本当にやりたいことは、スタッフメンバーのために存在する行を更新し、存在しない場合は新しい行を挿入することです。

誰もこれを行う方法を知っていますか、別のアプローチを提案できますか? 私は本当にユーザーのリストを反復するためにカーソルを使用しないようにしたいと思います(しかし、それは私のフォールバックオプションです)。

私はSQL Server 2005を使用しています。

編集:@ Lee:残念ながらInStage1 = 1は単純化されていました。 WHERE DateStarted IS NOT NULLとDateFinipuse IS NULLのようなものです。

編集:@BCS:すべてのスタッフの挿入を最初に行うという考えが好きなので、毎回更新を行うだけです。しかし、私はそれらのUPDATE文を正しく取得するのに苦労しています。

  ベストアンサー

IIRCには、行が存在する場合に更新できる「On Duplicate」(名前が間違っている可能性があります)構文があります(MySQL)

代わりにいくつかの形式:

 INSERT INTO @ResultTable (StaffName, Stage1Count, Stage2Count)
  SELECT StaffName,0,0 FROM ViewJob
  GROUP BY StaffName

UPDATE @ResultTable Stage1Count= (
  SELECT COUNT(*) AS count FROM ViewJob
  WHERE InStage1 = 1
  @ResultTable.StaffName = StaffName)

UPDATE @ResultTable Stage2Count= (
  SELECT COUNT(*) AS count FROM ViewJob
  WHERE InStage2 = 1
  @ResultTable.StaffName = StaffName)
 

  同じタグがついた質問を見る

sqlsql-servertsql