Изучение поворота в TSQL - PullRequest
       8

Изучение поворота в TSQL

0 голосов
/ 31 декабря 2018

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

У меня есть 'ID_code' и 'product_name', и я ищу несоответствующие названия продуктов, чтобы они располагались рядом друг с другом в ряду, а не в столбце, подобном следующему:

Select distinct ID_Code, product_name
From table
Where ID_Code in
(Select ID_Code from table
Group by ID_Code
Having count(distinct product_name) <> 1)

Мне бы хотелось, чтобы в таблице было указано

ID_Code Product_name1 Product_name2 Product_name3

Большое спасибо и счастливого Нового года!

Ответы [ 2 ]

0 голосов
/ 31 декабря 2018

Это должно удалить дубликаты, но все равно возвращает один результат, если имя_продукта имеет совпадение.

;with testdata as(
SELECT '1' as ID_Code, 'bike' as product_name
UNION ALL SELECT '1', 'biker'
UNION ALL SELECT '1', 'bike'
UNION ALL SELECT '2', 'motorbike'
UNION ALL SELECT '2', 'motorbike'
UNION ALL SELECT '2', 'motorbike'
UNION ALL SELECT '2', 'motrbike'
UNION ALL SELECT '2', 'motorbiker'
)

--added this section to return distinct products
,cte as(
SELECT * FROM testdata d1
INTERSECT
SELECT * FROM testdata d2
)

SELECT --DISTINCT   --Use DISTINCT here if need to return just one line per ID_Code 

    ID_Code
    ,product_name = STUFF((SELECT ', ' +
                        --Added this to track product_names for each ID_Code
                        t2.product_name + '_' + cast(ROW_NUMBER() OVER (PARTITION BY ID_Code ORDER BY product_name) as varchar(100))
      FROM cte t2
      WHERE t2.ID_Code = cte.ID_Code
      FOR XML PATH('')), 1, 2, '')

FROM cte

Пример здесь: db <> fiddle

Дополнительная информация о INTERSECT , если это не будет работать в этом сценарии.

0 голосов
/ 31 декабря 2018

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

SELECT
    ID_Code,
    STUFF((SELECT ',' + t2.product_name
      FROM yourTable t2
      WHERE t1.ID_Code = t2.ID_Code
      FOR XML PATH('')), 1, 1, '') products
FROM your_table t1
GROUP BY
    ID_Code
HAVING
    MIN(product_name) <> MAX(product_name);    -- index friendly

enter image description here

Демо

...