Dans SQL Server, les colonnes pivot dynamiques vous permettent de créer un tableau croisé dynamique dont les colonnes changent en fonction des valeurs d'une autre table. Ceci est utile lorsque le nombre de colonnes pivot est inconnu à l’avance ou change fréquemment.
Considérez la forme suivante :
Vous souhaitez créer un tableau croisé dynamique contenant une colonne pour chaque propriété du tableau Propriété. Cependant, le nombre de propriétés peut changer, vous avez donc besoin d'un moyen d'obtenir les noms de colonnes de manière dynamique.
Pour créer des colonnes pivot dynamiques, vous pouvez utiliser du SQL dynamique avec la clause PIVOT. Le code suivant illustre une solution :
<code class="language-sql">DECLARE @cols AS NVARCHAR(MAX); DECLARE @query AS NVARCHAR(MAX); -- 获取作为逗号分隔字符串的唯一属性名称 SELECT @cols = STUFF((SELECT DISTINCT ',' + QUOTENAME(Name) FROM property FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)'), 1, 1, ''); -- 构造动态查询 SET @query = 'SELECT * FROM ( SELECT o.object_id, p.Name, o.value FROM PropertyObjects AS o INNER JOIN property AS p ON o.Property_Id = p.Id ) AS t PIVOT ( MAX(value) FOR Name IN (' + @cols + ') ) AS p;'; -- 执行动态查询 EXEC(@query);</code>
La requête dynamique renverra un tableau croisé dynamique contenant une colonne pour chaque propriété de la table Propriété. La valeur dans le tableau croisé dynamique sera la valeur maximale pour chaque combinaison attribut-objet.
Par exemple, si la table Propriété contient les propriétés suivantes :
et la table PropertyObjects contient les données suivantes :
OBJECT_ID | PROPERTY_ID | VALUE |
---|---|---|
1 | 1 | ee |
1 | 2 | fd |
1 | 3 | fdf |
1 | 4 | ewre |
2 | 1 | dsd |
2 | 2 | sss |
2 | 3 | dfew |
2 | 4 | dff |
La requête dynamique renverra le tableau croisé dynamique suivant :
OBJECT_ID | PROPERTY1 | PROPERTY2 | PROPERTY3 | PROPERTY4 |
---|---|---|---|---|
1 | ee | fd | fdf | ewre |
2 | dsd | sss | dfew | dff |
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!