2017-09-12 15 views
0

J'ai créé une requête SQL dynamique qui joint quelques tables, puis fait pivoter une table appelée Géométries qui stocke les paires nom/valeur. Le SQL est dynamique, car au moment de l'exécution, je ne saurai pas quelles paires nom/valeur doivent pivoter.Colonnes SQL dupliquées dynamiques en mode Pivot

La requête ci-dessous me donne les données dont j'ai besoin, cependant, toutes les colonnes de géométrie sont répertoriées deux fois comme si je pivotais deux fois sur les mêmes données. Je ne peux pas comprendre pourquoi cela arrive. Je soupçonne que cela a à voir avec le fait que je sélectionne les paires Nom/Valeur dans mon expression de table commune qui sélectionne les colonnes Nom/Valeur de la géométrie à la ligne 13 de l'exemple de code ci-dessous: g.Name[Geometry], g.Value

Peut-être coupler cela avec le PIVOT code près du bas provoque les données de colonne en double dans mes résultats de requête?

Je ne peux pas supprimer le code sur la ligne 13, ou le PIVOT échoue avec des erreurs indiquant Géométrie et Valeur ne sont pas des noms de colonne valides.

Quoi qu'il en soit, voici la requête ...

DECLARE @cols AS NVARCHAR(MAX), @query AS NVARCHAR(MAX) 
SELECT @cols = STUFF((SELECT distinct ',' + QUOTENAME(g.Name) 
        FROM Geometries g 
        FOR XML PATH(''), TYPE 
        ).value('.', 'NVARCHAR(MAX)') 
       ,1,1,'') 
SET @query = 
    'SELECT *, ' + @cols + ' 
    FROM (
      SELECT 
       r.Id[RunId], rd.Id[RunDataId], r.RunNumber [Run #], r.TestNumber [Test #], r.Description, 
       rd.data1, rd.data2, rd.data3, 
       g.Name[Geometry], g.Value 
      FROM dbo.Runs r 
       INNER JOIN RunDatas rd ON r.Id = rd.RunId 
       INNER JOIN RunGeometries rg ON rg.RunId = r.Id 
       INNER JOIN Geometries g ON g.Id = rg.GeometryId 
     ) as data 
      PIVOT 
      (
       Max(Value) FOR Geometry IN (' + @cols + ') 
      ) as p' 

execute sp_executesql @query 

Toute aide pour déterminer ce qui est à l'origine des données en double serait apprécié.

+0

Probablement vos tables et non votre PIVOT. Faites un SELECT DISTINCT r.ID, rd.ID etc ... pour vous assurer que vous n'apportez pas de dupes pour PIVOT – Isaiah3015

Répondre

1

select * inclut les colonnes pivotantes; essayez ceci:

DECLARE @cols AS NVARCHAR(MAX), @query AS NVARCHAR(MAX) 
SELECT @cols = STUFF((SELECT distinct ',' + QUOTENAME(g.Name) 
        FROM Geometries g 
        FOR XML PATH(''), TYPE 
        ).value('.', 'NVARCHAR(MAX)') 
       ,1,1,'') 
SET @query = 
    'SELECT [RunId], [RunDataId], [Run #], [Test #], Description, data1, data2, data3, ' + @cols + ' 
    FROM (
      SELECT 
       r.Id as [RunId], rd.Id as [RunDataId], r.RunNumber as [Run #], r.TestNumber as [Test #], r.Description, 
       rd.data1, rd.data2, rd.data3, 
       g.Name[Geometry], g.Value 
      FROM dbo.Runs r 
       INNER JOIN RunDatas rd ON r.Id = rd.RunId 
       INNER JOIN RunGeometries rg ON rg.RunId = r.Id 
       INNER JOIN Geometries g ON g.Id = rg.GeometryId 
     ) as data 
      PIVOT 
      (
       Max(Value) FOR Geometry IN (' + @cols + ') 
      ) as p' 
print @query -- you can also take a look at the code you are generating to help troublshoot 
execute sp_executesql @query 

Vous pouvez également vérifier le code qui est généré avec print @query ou select @query.