Richard Deeming
Если PartDone
это всегда четыре числа, тогда вам не нужно PIVOT
:
DECLARE @tmp TABLE (partId int, PartDone char(4));
INSERT INTO @tmp (partId, partDone)
VALUES
(555444, '0012'),
(911877, '0221')
;
SELECT
partId,
PartDone,
CASE Substring(PartDone, 1, 1)
WHEN '0' THEN 'no'
WHEN '1' THEN 'yes'
END As [first],
CASE Substring(PartDone, 2, 1)
WHEN '0' THEN 'no'
WHEN '1' THEN 'yes'
END As [second],
CASE Substring(PartDone, 3, 1)
WHEN '0' THEN 'no'
WHEN '1' THEN 'yes'
END As [third],
CASE Substring(PartDone, 4, 1)
WHEN '0' THEN 'no'
WHEN '1' THEN 'yes'
END As [fourth]
FROM
@tmp
;
NB: Если это всегда четыре числа, вы не должны определять поле как
nvarchar(50)
Вы знаете, что он никогда не будет содержать никаких "расширенных" символов, поэтому вам не нужно
n
префикс. Вы знаете, что длина никогда не будет больше, чем
4
, так что вам не нужно место для
50
персонажи. И вы знаете, что длина никогда не будет
меньше чем
4
, так что вам не нужно поле переменной длины.
Определите это поле следующим образом
char(4)
вместо.
Лучшим вариантом было бы определить четыре
bit
поля, и сделать так, чтобы
PartDone
поле вычисляемый столбец:
DECLARE @tmp TABLE
(
PartId int,
[first] bit,
[second] bit,
[third] bit,
[fourth] bit,
PartDone As
(
CASE WHEN [first] Is Null THEN '2' ELSE CAST([first] As char(1)) END
+ CASE WHEN [second] Is Null THEN '2' ELSE CAST([second] As char(1)) END
+ CASE WHEN [third] Is Null THEN '2' ELSE CAST([third] As char(1)) END
+ CASE WHEN [fourth] Is Null THEN '2' ELSE CAST([fourth] As char(1)) END
)
);
INSERT INTO @tmp (PartId, [first], [second], [third], [fourth])
VALUES
(555444, 0, 0, 1, NULL),
(911877, 0, NULL, NULL, 1)
;
SELECT
PartId,
PartDone,
CASE [first] WHEN 0 THEN 'no' WHEN 1 THEN 'yes' END As [first],
CASE [second] WHEN 0 THEN 'no' WHEN 1 THEN 'yes' END As [second],
CASE [third] WHEN 0 THEN 'no' WHEN 1 THEN 'yes' END As [third],
CASE [fourth] WHEN 0 THEN 'no' WHEN 1 THEN 'yes' END As [fourth]
FROM
@tmp
;