SQL Server动态数据透视表-列名重复

问题描述 投票:0回答:1

我正在尝试透视表作为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个回答
0
投票

是否在“数据透视表”栏中都需要所有值?如果是这样,您可以选择带有别名的电话号码本身。例如

SELECT Value As PhoneNumber
FROM (either @UDT or #temp)
WHERE DatabaseFieldName = 'PhoneNumber'
© www.soinside.com 2019 - 2024. All rights reserved.