繁体   English   中英

SQL将第二个表中的行作为列连接

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM