【问题标题】:SQL Server Dynamic Pivot Table - Column Name DuplicateSQL Server 动态数据透视表 - 列名重复
【发布时间】:2019-10-01 12:18:37
【问题描述】:

我正在尝试透视作为 UDT 传入的表。第 1 列将具有重复值,第 2 列将具有不同的值(示例如下)。我希望将列名设置为电话号码和电话号码列下的两个值。

    DECLARE @query AS NVARCHAR(MAX) = '';

    --Temp Table to act as UDT for ease of testing
    DECLARE @udt TABLE (DatabaseFieldName nvarchar(50), Value nvarchar(50))

    INSERT INTO @udt VALUES('PhoneNumber','01234567890')
    INSERT INTO @udt VALUES('PhoneNumber','09876543210')

    --Preview of table before Pivot
    select * from @udt

    CREATE TABLE #temp
    (
    DatabaseFieldName nvarchar(50),
    Value nvarchar(50)
    )

    INSERT INTO #temp
    SELECT DatabaseFieldName, Value 
    FROM @udt

    SELECT @cols = @cols + QUOTENAME(DatabaseFieldName) + ',' FROM (select distinct DatabaseFieldName from #temp) as temp
    SELECT @cols = substring(@cols, 0, len(@cols)) -- Trims ',' at the end

    SET @query =
    '
    SELECT * FROM
    (
        SELECT DatabaseFieldName, Value
        FROM #temp
    ) AS SRC
    PIVOT
    (
        MIN(Value) for DatabaseFieldName in (' + @cols + ')
    ) AS PivotTable';

    execute(@query)
    DROP TABLE #temp

当前和期望结果的示例

Data as it comes in:

DatabaseFieldName | Value
--------------------------------
PhoneNumber       | 01234567890
PhoneNumber       | 09876543210

Outcome I am hoping to get:

PhoneNumber
------------
01234567890
09876543210

What I am currently getting:

PhoneNumber
------------
01234567890

由于在select语句中使用了distinct,目前第二个数字被忽略了,但是如果不使用distinct,则会引发错误。

【问题讨论】:

    标签: sql-server stored-procedures pivot dynamic-sql


    【解决方案1】:

    透视列PhoneNumbers 中是否包含您想要的所有值?如果是这样,您可以使用别名自己选择电话号码。例如

    SELECT Value As PhoneNumber
    FROM (either @UDT or #temp)
    WHERE DatabaseFieldName = 'PhoneNumber'
    

    除非我在这里遗漏了一个要求,否则这将满足您的所有需求。

    【讨论】:

      【解决方案2】:

      这不是由于 DISTINCT,而是因为使用 MIN(Value) ,它得到了第一个。 假设您有另一组行

      INSERT INTO @udt VALUES('Name','Hello')
      INSERT INTO @udt VALUES('Name','Test')
      

      现在动态 SQL 的结果集将如下所示。

      Name    PhoneNumber
      Hello   01234567890
      

      已经说过 PIVOT 只能与聚合函数一起使用,如果删除 MIN 则会出错。您可能必须考虑其他选项来获得所需的结果,例如在多个字段需要时使用 case

      SELECT CASE WHEN DatabaseFieldName = 'PhoneNumber' THEN Value END AS PhoneNumber,
             CASE WHEN DatabaseFieldName = 'Name' THEN Value END AS Name
             FROM @udt
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-02-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-16
        • 2014-07-26
        相关资源
        最近更新 更多