I'm sure there's a more efficient way to do it but once you have your data in SQL in a temp table (I just hacked a method together to do that, which you could do from your Excel workbook by generating insert statements if you have no other easier way) ...
DECLARE @tblData TABLE
(
iRowNo int identity(1,1),
sField nvarchar(100),
sValue nvarchar(1000)
)
INSERT INTO @tblData VALUES ('Number', '123456')
INSERT INTO @tblData VALUES ('name', 'John')
INSERT INTO @tblData VALUES ('province', 'Quebec')
INSERT INTO @tblData VALUES ('client', 'Client 1')
INSERT INTO @tblData VALUES ('type', 'Type 1')
INSERT INTO @tblData VALUES ('Number', '458965')
INSERT INTO @tblData VALUES ('name', 'sammy')
INSERT INTO @tblData VALUES ('province', 'ontario')
INSERT INTO @tblData VALUES ('client', 'Client 2')
INSERT INTO @tblData VALUES ('type', 'Type 2')
... you can try the below query ...
SELECT iRowNo, sValue AS Number,
Name = (SELECT TOP (1) B.sValue FROM @tblData AS B WHERE B.sField = 'name' AND B.iRowNo > A.iRowNo ORDER BY iRowNo),
Province = (SELECT TOP (1) B.sValue FROM @tblData AS B WHERE B.sField = 'province' AND B.iRowNo > A.iRowNo ORDER BY iRowNo),
Client = (SELECT TOP (1) B.sValue FROM @tblData AS B WHERE B.sField = 'client' AND B.iRowNo > A.iRowNo ORDER BY iRowNo),
Type = (SELECT TOP (1) B.sValue FROM @tblData AS B WHERE B.sField = 'type' AND B.iRowNo > A.iRowNo ORDER BY iRowNo)
FROM @tblData AS A
WHERE sField = 'Number'
... which gave me the below result ...

... not sure if that helps but based on what you were asking, I think that is the result you're looking for.
I have to admit, I was heavy on the SQL side of things about 8 years ago so there may be a better way to get your answer in this new day and age, or maybe always. :-)
Anyway, worth a shot ...!