[英]SQL join rows from second table as columns
这可能是一个重复的问题,但我找不到。 也许我在考虑这个倒退。
如何格式化查询以使用下面的源表返回这样的结果?
文件名 | 属性1 | 属性2 | 属性 3 | 配置 |
---|---|---|---|---|
文件1.txt | val1 | VAL2 | VAL3 | 默认 |
文件1.txt | val1 | VAL2 | VAL3 | 第一的 |
文件表
文档编号 | 文件名 |
---|---|
1 | 文件1.txt |
变量值表
变量ID | 文档编号 | 值缓存 | 配置ID |
---|---|---|---|
55 | 1 | val1 | 1 |
56 | 1 | VAL2 | 1 |
172 | 1 | VAL3 | 1 |
55 | 1 | val1 | 2 |
56 | 1 | VAL2 | 2 |
172 | 1 | VAL3 | 2 |
配置表
配置ID | 配置名称 |
---|---|
1 | 默认 |
2 | 第一的 |
我最初是用子查询写的
select top 10 d.Filename,
(select ValueCache from VariableValue vv where d.DocumentID = vv.DocumentID and vv.VariableID = 55) as Description,
(select ValueCache from VariableValue vv where d.DocumentID = vv.DocumentID and vv.VariableID = 56) as PartNumber,
(select ValueCache from VariableValue vv where d.DocumentID = vv.DocumentID and vv.VariableID = 172) as CrossReference,
dc.ConfigurationName
FROM Documents d
INNER JOIN VariableValue vv ON d.DocumentID = vv.DocumentID
inner join DocumentConfiguration dc ON dc.ConfigurationID = vv.ConfigurationID
但这不能正确处理配置,当有多个配置时,子查询会返回多个结果。 所以我尝试将其转换为表值查询,但这会在单独的行上返回每个变量,我无法弄清楚如何转置它们。
select top 10 d.Filename, d.DocumentID, ConfigurationID, d.CurrentStatusID
into #temp
FROM Documents d
INNER JOIN VariableValue vv ON d.DocumentID = vv.DocumentID
WHERE vv.VariableID = 172 and ValueCache is not null
select t.Filename, vv.ValueCache, v.VariableName, s.Name from #temp t
inner join VariableValue vv ON t.DocumentID = vv.DocumentID and t.ConfigurationID = vv.ConfigurationID
inner join Variable v ON vv.VariableID = v.VariableID and v.VariableID in (55, 56, 172)
inner join [Status] s ON s.StatusID = t.CurrentStatusID
drop table #temp
您可以在两种情况下对INNER JOIN
查询使用PIVOT
函数:
第一个:如果ValueCache
值的数量已知,即只有(val1, val2, val3)
select Filename, Val1 as att1, Val2 as att2, Val3 as att3, ConfigName from
(
select Documents.Filename, VariableValues.ValueCache,Configuration.ConfigName
from
Documents inner join VariableValues
on Documents.DocumentID=VariableValues.DocumentID
inner join Configuration
on Configuration.ConfigurationID = VariableValues.ConfigurationID
) D
PIVOT
(MAX(ValueCache) for ValueCache in (Val1, Val2, Val3)) P
第二个:如果ValueCache
值的数量未知,那么您可以使用Dynamic SQL Query
DECLARE @valCols AS NVARCHAR(MAX), @sqlQr AS NVARCHAR(MAX)
select @valCols = STUFF((SELECT distinct ',' + QUOTENAME(ValueCache)
from VariableValues FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @sqlQr = 'SELECT Filename, ' + @valCols + ', ConfigName from
(
select Documents.Filename, VariableValues.ValueCache,Configuration.ConfigName
from
Documents inner join VariableValues
on Documents.DocumentID=VariableValues.DocumentID
inner join Configuration
on Configuration.ConfigurationID = VariableValues.ConfigurationID
) D
PIVOT
(MAX(ValueCache) for ValueCache in ('+ @valCols+ ')) P'
execute(@sqlQr)
查看结果表格dbfiddle 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.