Данные преобразования SQL - PullRequest
0 голосов
/ 26 апреля 2018

У меня есть результаты из запроса в следующем формате

ID CODE
----------
 1   abc
 1   xyz
 1   def
 1   pqr
 1   jkl
 1   tuv

Я хочу, чтобы результаты были в следующем формате

ID CODE1 CODE2 CODE3 CODE4 CODE5 CODE6
---------------------------------------
1  abc   xyz   def   pqr   jkl   tuv

Я знаю, что этого можно достичь с помощью статического запроса PIVOT, но проблема, с которой я сталкиваюсь, заключается в том, что столбец CODE может иметь неизвестные значения, и я хочу, чтобы имена моих столбцов были фиксированными, т.е. CODE1, CODE2 и так далее до '1011 *.

Может кто-нибудь помочь мне с этим?

Любые предложения приветствуются.

Спасибо.

1 Ответ

0 голосов
/ 26 апреля 2018

Это может быть довольно простой PIVOT, использующий оконную функцию ROW_NUMBER(). Я добавил 7-й CODE для ID 1, чтобы показать, что он будет игнорироваться, если вы поворачиваете только 6 столбцов, потому что ваш OVER не является детерминированным (он может ORDER любым способом, каким пожелает поскольку он использует только ID), он может получить другой набор из 6 CODE с.

SQL Fiddle

Настройка схемы MS SQL Server 2017 :

CREATE TABLE t1 ( ID int, _CODE varchar(20) ) ;
INSERT INTO t1 (ID, _CODE)
VALUES 
    (1,'abc')
  , (1,'xyz')
  , (1,'def')
  , (1,'pqr')
  , (1,'jkl')
  , (1,'tuv')
  , (2,'lmn')
  , (2,'rgb')
  , (1,'ignoredOnly6')
;

Запрос 1 :

SELECT piv.ID
  , piv.[1] AS CODE1
  , piv.[2] AS CODE2
  , piv.[3] AS CODE3
  , piv.[4] AS CODE4 
  , piv.[5] AS CODE5 
  , piv.[6] AS CODE6
FROM (
  SELECT t1.ID, t1._CODE
    , ROW_NUMBER() OVER (PARTITION BY t1.ID ORDER BY t1.ID) AS rn
  FROM t1
) s1
PIVOT (
  max(s1._CODE) 
  FOR s1.rn IN ([1],[2],[3],[4],[5],[6]) 
) piv

Результаты :

| ID | CODE1 | CODE2 |  CODE3 |  CODE4 |  CODE5 |  CODE6 |
|----|-------|-------|--------|--------|--------|--------|
|  1 |   abc |   xyz |    def |    pqr |    jkl |    tuv |
|  2 |   lmn |   rgb | (null) | (null) | (null) | (null) |
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...