3

ジョブのリストを含むビューがあり、ジョブが誰に割り当てられているか、どの段階にいるかなどのデータが含まれています。各段階で各人が持っているジョブの数を返すストアド プロシージャを作成する必要があります。

これまでのところ、これがあります(簡略化):

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

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

誰かがこれを行う方法を知っていますか、または別のアプローチを提案できますか? カーソルを使用してユーザーのリストを反復処理することは本当に避けたいと思います (しかし、それは私の代替オプションです)。

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

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

編集: @BCS:最初にすべてのスタッフを挿入するというアイデアが気に入っているので、毎回更新するだけです。しかし、私はそれらの UPDATE ステートメントを正しくするのに苦労しています。

4

6 に答える 6

3

実際、あなたはそれを実際よりもずっと難しくしていると思います。このコードは、あなたがやろうとしていることに対して機能しませんか?

SELECT StaffName, SUM(InStage1) AS 'JobsAtStage1', SUM(InStage2) AS 'JobsAtStage2'
  FROM ViewJob
GROUP BY StaffName
于 2008-08-20T23:58:32.377 に答える
2

存在を確認して、適切なコマンドを使用するだけです。これは実際に舞台裏でカーソルを使用していると思いますが、おそらくこれが最良の方法です。

IF (EXISTS (SELECT * FROM MyTable WHERE StaffName = @StaffName))
begin
    UPDATE MyTable SET ... WHERE StaffName = @StaffName
end
else
begin
    INSERT MyTable ...
end 

SQL2008 にはクールな新しい MERGE 機能がありますが、2005 にはありません。

于 2008-08-20T23:57:20.320 に答える
1

実際の「upsert」タイプのクエリを取得するには、if exists... タイプのものを使用する必要がありますが、これは残念ながらカーソルを使用することを意味します。

ただし、2 つのクエリを実行できます。1 つは既存の行がある場所で更新を行い、その後新しい行を挿入します。少数の行のみを扱っている場合を除き、このセットベースのアプローチが望ましいと思います。

于 2008-08-20T23:55:04.710 に答える
1

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)
于 2008-08-21T00:09:16.580 に答える
0

結果テーブルに対する次のクエリは、行を再度結合する必要があります。これは、InStage1 と InStage2 が両方とも「1」にならないことを前提としています。

select distinct(rt1.StaffName), rt2.Stage1Count, rt3.Stage2Count
from @ResultTable rt1
left join @ResultTable rt2 on rt1.StaffName=rt2.StaffName and rt2.Stage1Count is not null
left join @ResultTable rt3 on rt1.StaffName=rt2.StaffName and rt3.Stage2Count is not null
于 2008-08-21T00:03:12.850 に答える
0

私はBCSの答えのバリエーションでそれをうまく動かすことができました。ただし、テーブル変数を使用できないため、一時テーブルを作成する必要がありました。

CREATE TABLE #ResultTable
(
  StaffName nvarchar(100),
  Stage1Count int,
  Stage2Count int
)

INSERT INTO #ResultTable (StaffName)
  SELECT StaffName FROM ViewJob
  GROUP BY StaffName

UPDATE #ResultTable SET 
  Stage1Count= (
    SELECT COUNT(*) FROM ViewJob V
    WHERE InStage1 = 1 AND 
        V.StaffName = @ResultTable.StaffName COLLATE Latin1_General_CI_AS
    GROUP BY V.StaffName),
  Stage2Count= (
    SELECT COUNT(*) FROM ViewJob V
    WHERE InStage2 = 1 AND 
        V.StaffName = @ResultTable.StaffName COLLATE Latin1_General_CI_AS
    GROUP BY V.StaffName)

SELECT StaffName, Stage1Count, Stage2Count FROM #ResultTable

DROP TABLE #ResultTable
于 2008-08-21T01:40:23.397 に答える