Projects という名前の SQL Server テーブルに PID という整数フィールド (基本的にはカウンター) があり、別のフィールド (タスク) の値が変更された場合にのみインクリメントしたいと考えています。最初は、すべての行で PID=1 です。次のクエリ(他の場所での回答の1つから入手したもの)は、まさに私が望むことを行いますが、結果でテーブルを更新する必要があり、それを理解できません。
SELECT Task,
dense_rank() over(order by Task) PID
FROM dbo.Projects;
私が何かをするなら
Update Projects
SET Projects.PID =(SELECT Task,
dense_rank() over(order by Task) PID
FROM dbo.Projects);
「INSERT ステートメントの選択リストには、挿入リストよりも多くの項目が含まれています。SELECT 値の数は、INSERT 列の数と一致する必要があります。」というメッセージが表示されます。必要なものを提供するクエリでテーブルを更新するにはどうすればよいですか?
これはテーブルのデザインです:
CREATE TABLE [dbo].[Projects]
(
[PID] [int] NULL
, [TID] [int] IDENTITY(1,1) NOT NULL
, [Project] [nvarchar](127) NOT NULL
, [Task] [nvarchar](127) NOT NULL
, [Dollars] [decimal](18, 0) NOT NULL
, [TaskLead] [nvarchar](127) NULL
) ON [PRIMARY];
テーブルにデータを入力します
INSERT INTO dbo.Projects(Project, Task, Dollars, TaskLead)
SELECT Project + ' ' + ProjectDescription, Task + ' ' + TaskDescription, Dollars, TaskLead
FROM TM1_1
ORDER BY Project ASC, Task ASC;
例:
PID TID Project Task
1 1 Prj1 Tsk11
1 2 Prj1 Tsk12
2 1 Prj2 Tsk21
同じプロジェクトがすべて同じ PID を持つようにテーブルを更新したいと考えています。私は今しようとしています:
use mbt_tm1;
;WITH cteRank AS (
SELECT PID, DENSE_RANK() OVER ( PARTITION BY Project ORDER BY Project ASC) AS Calculated_Rank
FROM Projects )
UPDATE cteRank
SET PID = Calculated_Rank