Динамическая сводная таблица SQL Server - дубликат имени столбца - PullRequest
0 голосов
/ 01 октября 2019

Я пытаюсь повернуть таблицу, переданную как 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

В настоящий момент второе число игнорируется из-за использования в операторе выбора словаекты, однако выдается ошибка, еслиотличное не используется.

Ответы [ 2 ]

0 голосов
/ 04 октября 2019

Это не из-за DISTINCT, а из-за использования MIN (Value), он получает первый. Допустим, у вас был другой набор строк

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

Теперь результирующий набор вашего динамического SQL будет выглядеть следующим образом.

Name    PhoneNumber
Hello   01234567890

Сказав, что PIVOT может использоваться только с агрегатными функциями, вы получите ошибку, если MIN будет удален. Возможно, вам придется подумать о других вариантах получения желаемых результатов, таких как использование регистра при необходимости для нескольких полей

SELECT CASE WHEN DatabaseFieldName = 'PhoneNumber' THEN Value END AS PhoneNumber,
       CASE WHEN DatabaseFieldName = 'Name' THEN Value END AS Name
       FROM @udt
0 голосов
/ 04 октября 2019

Все ли значения, которые вы хотите в сводном столбце PhoneNumbers? Если это так, вы можете просто выбрать номера телефонов с псевдонимом. Например,

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

Если здесь не указано требование, которое я пропускаю, это сделало бы все, что вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...