What if there are two rows that are NULL for the same student?
The solution below tries to cater for this, but since I don't know the actual underlying business problem, I may not be on target.
CREATE TABLE [dbo].[test_table](
[ID] [bigint] NULL,
[Score] [numeric](38, 6) NOT NULL,
[Ratio] [numeric](38, 6) NOT NULL,
[Desc] [varchar](50) NULL,
[Report] [varchar](8) NULL
) ON [PRIMARY]
GO
INSERT [dbo].[test_table] ([ID], [Score], [Ratio], [Desc], [Report]) VALUES (9, CAST(0.000000 AS Numeric(38, 6)), CAST(1.000000 AS Numeric(38, 6)), N'Base2', NULL)
INSERT [dbo].[test_table] ([ID], [Score], [Ratio], [Desc], [Report]) VALUES (9, CAST(0.205128 AS Numeric(38, 6)), CAST(0.794872 AS Numeric(38, 6)), N'Base2', N'ODDS')
INSERT [dbo].[test_table] ([ID], [Score], [Ratio], [Desc], [Report]) VALUES (9, CAST(0.250000 AS Numeric(38, 6)), CAST(0.750000 AS Numeric(38, 6)), N'Base2', N'RET')
INSERT [dbo].[test_table] ([ID], [Score], [Ratio], [Desc], [Report]) VALUES (5, CAST(0.000000 AS Numeric(38, 6)), CAST(1.000000 AS Numeric(38, 6)), N'Base2', NULL)
INSERT [dbo].[test_table] ([ID], [Score], [Ratio], [Desc], [Report]) VALUES (5, CAST(0.250000 AS Numeric(38, 6)), CAST(0.750000 AS Numeric(38, 6)), N'Base2', N'BUSI')
INSERT [dbo].[test_table] ([ID], [Score], [Ratio], [Desc], [Report]) VALUES (5, CAST(0.187500 AS Numeric(38, 6)), CAST(0.812500 AS Numeric(38, 6)), N'Base2', N'ODDS')
INSERT [dbo].[test_table] ([ID], [Score], [Ratio], [Desc], [Report]) VALUES (3, CAST(0.000000 AS Numeric(38, 6)), CAST(1.000000 AS Numeric(38, 6)), N'Base2', NULL)
INSERT [dbo].[test_table] ([ID], [Score], [Ratio], [Desc], [Report]) VALUES (3, CAST(0.250000 AS Numeric(38, 6)), CAST(0.750000 AS Numeric(38, 6)), N'Base2', NULL)
INSERT [dbo].[test_table] ([ID], [Score], [Ratio], [Desc], [Report]) VALUES (3, CAST(0.296875 AS Numeric(38, 6)), CAST(0.703125 AS Numeric(38, 6)), N'Base2', N'ODDS')
go
SELECT * FROM test_table
go
DECLARE @reports TABLE (rep char(4) NOT NULL PRIMARY KEY,
score decimal (38,6) NOT NULL)
INSERT @reports (rep, score)
VALUES('BUSI', 0.25),
('ODDS', 0.5),
('RET', 0.25)
; WITH numberingmissing AS (
SELECT Score, Report, ID, rowno = row_number() OVER(PARTITION BY ID ORDER BY Ratio)
FROM test_table
WHERE Report IS NULL
)
UPDATE nm
SET Report = X.rep,
Score = X.score
FROM numberingmissing nm
CROSS APPLY (SELECT Y.rep, Y.score
FROM (SELECT rep, score, rowno = row_number() OVER(ORDER BY rep)
FROM @reports r
WHERE NOT EXISTS (SELECT *
FROM test_table tt
WHERE tt.ID = nm.ID
AND tt.Report = r.rep)) AS Y
WHERE Y.rowno = nm.rowno) AS X
go
SELECT * FROM test_table
go
DROP TABLE test_table