透视sql server多个表和列
Posted
技术标签:
【中文标题】透视sql server多个表和列【英文标题】:Pivot sql server multiple tables and columns 【发布时间】:2015-07-23 11:25:43 【问题描述】:这是我第一次来这里。一般来说,我会找到一些答案,但现在我在使用 PIVOT sql server 2012 时遇到了一个大问题。我只是一名实习生,我不知道如何在使用 php 时使用多个表和列进行 PIVOTS。 所以我有 3 个表(Equipements、Champ-perso、Equipement_Complément),我成功地通过使用 PHP 的 SQL 查询显示了所有数据。但是在这个显示中,有重复的装备,Champ-Perso 和 Equipement_Complément 出现在行中。 我想做一个 PIVOT 函数,它删除重复的设备,并在列中显示 Champ-Perso 和 Equipement_Complément。
这是我的展示
`Name_Equipement Champ-Perso Equipemennt-Complément
ENG-0001 Année rénovation A
ENG-0001 Largeur utile (mm) B
ENG-0001 Nb de pinces de dépose C
ENG-0001 Nb de postes dengagement D
ENG-0001 Nb de voies E
ENG-0001 Numéro du train F
ENG-0001 Type/modèle G
ENG-0002 Année rénovation A1
ENG-0002 Largeur utile (mm) B1
ENG-0002 Nb de pinces de dépose C1
ENG-0002 Nb de postes dengagement D1
ENG-0002 Nb de voies E1
ENG-0002 Numéro du train F1
ENG-0002 Type/modèle G1
`
我想显示
`Name_Equipment Année rénovation Largeur Utile (mm) ... Type:Modèle
ENG-0001 A B ... G
ENG-0002 A1 B1 ... G1
`
【问题讨论】:
如果 Champ_perso 有 n 个(变量)值,那么您必须使用动态 sql,例如 ***.com/questions/10404348/…。如果您知道 champ-Perso 将始终是相同的数字(在这种情况下出现 7),那么您可以使用普通的 Pivot 来执行此操作。您只需将 camp-perso 值硬编码到枢轴中。 .为了帮助超出此范围,我们需要查看 SQL 表结构。想要的结果会有所帮助,但如果没有 SQL 或表结构是不够的 表结构是必需的。但是,select DISTINCT
就够了吗?
请你告诉我我的查询是否正确,因为在 SQL 服务器中我收到一个错误,例如“无法添加表 'SELECT'”:SELECT EQUIPEMENTS.EQU_EQUIPEMENT,[EQU_COMPLEMENTS.EQC_VALEUR_A], [CHAMPS_PERSOS.CHP_DESIGNATION] FROM (My sql query) as src PIVOT ( FOR CHAMPS_PERSOS.CHP_DESIGNATION IN([Année rénovation], [Largeur utile (mm)], [Nb de pinces de dépose], [Nb de postes deengagement], [ Nb de voies], [Numéro de train], [Type/model]) ) 作为 Pv1
【参考方案1】:
这里是您问题的解决方案。我假设您问题中显示的数据在表#temp
中。
首先,您需要从您的表中找到唯一的Champ-Perso
。使用下面的查询。
select * into #temp1 from (select distinct([Champ-Perso]) from #temp) as A
现在编写如下所示的数据透视查询...
Declare @str nvarchar(1000)
Declare @SQL nvarchar(1000)
SELECT @str = COALESCE(@str+'],[', '') + [Champ-Perso] FROM #temp1
set @str = '[' +@str + ']'
set @SQL = N' select [Name_Equipement], ' + @str +' from (select [Name_Equipement], [Champ-Perso], [Equipemennt-Complément] from #temp) as tbl
Pivot
(
max([Equipemennt-Complément])
for [Champ-Perso] in ('+ @str+')
) as p'
要获得结果,请触发此查询...
EXECUTE sp_executesql @sql
注意:由于Champ-Perso
在您的Name_Equipement
中并不常见,因此您会看到NULL
缺少值。
【讨论】:
以上是关于透视sql server多个表和列的主要内容,如果未能解决你的问题,请参考以下文章