透视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多个表和列的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server如何查找表名或列名中包含空格的表和列

基于 SQL Server 中的一列透视多列

SQL Server 元数据表和列描述 [重复]

为啥我们在 SQL Server 中透视文本列时使用 Max 函数?

如何使用 SQL Server 透视多个列

在SQL Server 中创建外键