Вы можете использовать оператор PIVOT:
SELECT *
FROM
(
SELECT * FROM YourTable
)AS FooData
PIVOT(
AVG(FooData.Measurement)
FOR Unit IN ([Unit 1], [Unit 2], [Unit 3])
) AS FooPivot
Пример:
DECLARE @tbl TABLE
(
key1 varchar(50),
Unit VARCHAR(50),
Measurement DECIMAL(18,8)
)
INSERT INTO @tbl
(
key1,
Unit,
Measurement
)
VALUES
('04A', 'Unit 1', 156.8000)
, ('04A', 'Unit 2', 5.8453000)
, ('678R', 'Unit 1', 8.6000)
, ('678R', 'Unit 2', 409.6000)
, ('678R', 'Unit 3', 17)
SELECT *
FROM
(
SELECT * FROM @tbl
)AS FooData
PIVOT(
AVG(FooData.Measurement)
FOR Unit IN ([Unit 1], [Unit 2], [Unit 3])
) AS FooPivot
ВЫХОД:
key1 Unit 1 Unit 2 Unit 3
04A 156.80000000 5.84530000 NULL
678R 8.60000000 409.60000000 17.00000000
ОБНОВЛЕНИЕ:
Я не знаю, какой фактический тип данных поля Measurement
имеет значение 5.845,3000
, однако я твердо верю, что эти данные имеют тип numeric
.Если да, то лучше хранить числовые данные как числовой тип, так как это ответственность уровня представления, потому что существуют разные требования для отображения чисел в разных странах.Для добавления запятых вы можете использовать каналы на стороне клиента.
Кроме того, если Measurement
является типом номера и вы сохраните его как varchar(50)
, то при оформлении заказа у вас возникнут проблемы.Так что лучше хранить как numeric
.
В противном случае вы можете использовать тип данных varchar(255)
:
DECLARE @tbl TABLE
(
key1 varchar(50),
Unit VARCHAR(50),
Measurement VARCHAR(255)
)
INSERT INTO @tbl
(
key1,
Unit,
Measurement
)
VALUES
('04A', 'Unit 1', '156.8000')
, ('04A', 'Unit 2', '5,845.3000')
, ('678R', 'Unit 1', '8.6000')
, ('678R', 'Unit 2', '409.6000')
, ('678R', 'Unit 3', '17')
SELECT *
FROM
(
SELECT * FROM @tbl
)AS FooData
PIVOT(
MAX(FooData.Measurement)
FOR Unit IN ([Unit 1], [Unit 2], [Unit 3])
) AS FooPivot