我有一个如下所示的SQL Server表:
RESOURCE | DESCRIPTION | VALUE
Test A Name | Resource A-xyz
Test A | Height | 20
Test A | Unit | ft
Test A | Location | Site 1
Test B | Volume | 30
Test C | Width | 10
Test C | Unit | in
我想把它变成这种格式:
RESOURCE | Name | Height | Unit | Location | Volume | Width
Test A | Resource A-xyz | 20 | ft | Site 1 | |
Test B | | | | | 30 |
Test C | | | in | | | 10
我遇到的一个问题是没有固定的描述模式;例如,资源“测试B”可能具有与“测试A”相同的描述,而“测试C”可能缺少一些,“测试D”可能具有完全不同的集合。
到目前为止,Google建议我使用数据透视表,但我仍然不确定如何使用上述数据。
答案 0 :(得分:0)
生成的列列表基于您在PIVOT
中提供的顺序:
SELECT *
FROM Table1
PIVOT(MAX(VALUE) FOR DESCRIPTION IN (Name,Height,Unit,Location,Volume,Width))p
演示:SQL Fiddle
如果您更改了DESCRIPTION
的值,那么动态构建此查询是值得的,有很多很好的示例可以找到“动态数据透视”。
答案 1 :(得分:0)
试试这段代码:
SELECT resource,Name,Height,Unit,Location,Volume,Width
FROM
#T1 AS SourceTable
PIVOT
(
max(value)
FOR description IN ([Name],[Height],[Unit],[Location],[Volume],[Width])
) AS PivotTable
ORDER BY 1
答案 2 :(得分:0)
如果您不想对列进行硬编码并希望动态生成相同的视图,则可以使用此功能。这将生成动态数据透视
CREATE TABLE demo
(
RESOURCE VARCHAR(100),
DESCRIPTION VARCHAR(100), VALUE VARCHAR(100)
)
INSERT INTO demo VALUES
('Test A' , 'Name' , 'Resource A-xyz')
,('Test A' , 'Height' , '20')
,('Test A' , 'Unit' , 'ft')
,('Test A' , 'Location' , 'Site 1')
,('Test B' , 'Volume' , '30')
,('Test C' , 'Width' , '10')
,('Test C' , 'Unit' , 'in')
SELECT DISTINCT DESCRIPTION INTO #tbl FROM demo
//Get list of values to be pivoted
DECLARE @var NVARCHAR(1000)=''
SELECT @var = @var +', ' + DESCRIPTION FROM #tbl
SELECT @var = SUBSTRING(@var, 2, LEN(@var))
SELECT @var
DECLARE @query NVARCHAR(2000) = 'SELECT * FROM demo PIVOT(MAX(VALUE) FOR DESCRIPTION IN ('+ @var + '))p'
EXEC sp_executesql @query
答案 3 :(得分:0)
最后,我做了以下事情:
例如
CREATE TABLE #tb1
(
[RESOURCE] varchar(100),
[FIELD1] varchar(100),
[FIELD2] varchar(50),
.
.
.
[LAST FIELD] varchar(50),
)
INSERT INTO #tb1 (RESOURCE)
SELECT DISTINCT RESOURCE FROM tb2
ORDER BY Resource ASC
UPDATE #tb1 SET [FIELD1] = (SELECT VALUE FROM tb2 WHERE Resource = #tb1.Resource and Property = [FIELD1])
.
.
.
UPDATE #tb1 SET [LAST FIELD] = (SELECT VALUE FROM tb2 WHERE Resource = #tb1.Resource and Property = [LAST FIELD])