【问题标题】:Dynamic SQL Pivot Causing Duplicate Columns导致重复列的动态 SQL 枢轴
【发布时间】:2017-09-12 18:45:24
【问题描述】:

我创建了一个动态 SQL 查询,它连接了几个表,然后从一个名为 Geometries 的表中提取出来,该表存储名称/值对。 SQL 是动态的,因为在运行时我不知道需要转出哪些名称/值对。

下面的查询为我提供了我需要的数据,但是,所有几何列都列出了两次,就好像我从同一数据中旋转了两次一样。我无法弄清楚为什么会发生这种情况。我怀疑这与我在公用表表达式中选择名称/值对的事实有关,该表达式在下面的代码示例的第 13 行选择几何名称/值列:g.Name[Geometry], g.Value

也许将它与底部附近的 PIVOT 代码结合会导致我的查询结果中出现重复的列数据?

我无法删除第 13 行的代码,或者 PIVOT 失败并出现错误,指出 Geometry 和 Value 不是有效的列名。

无论如何,这里是查询...

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

任何帮助找出导致重复数据的原因将不胜感激。

【问题讨论】:

  • 可能是您的表格,而不是您的 PIVOT。执行 SELECT DISTINCT r.ID、rd.ID 等...以确保您没有为 PIVOT 带来欺骗

标签: sql sql-server pivot dynamic-sql


【解决方案1】:

select * 包括您正在旋转的列;试试这个:

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

您还可以检查使用print @queryselect @query 生成的代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-26
    • 1970-01-01
    • 1970-01-01
    • 2013-06-06
    • 1970-01-01
    • 2021-11-26
    相关资源
    最近更新 更多