сводная таблица на сервере MS SQL без возрастающего / целочисленного идентификатора - PullRequest
0 голосов
/ 27 апреля 2018

У меня проблема с поворотом таблицы в ms-sql-сервере. Я пробовал разные вещи с PIVOT, но я не понимаю, и все еще есть проблемы, чтобы сделать это правильно.

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

Я начинаю с этой таблицы:

id  no1  no2    name    state
-------------------------------
11  5503 NULL   alf     0
11  8533 X1705  ben     0
11  2716 X0608  cha     1
11  5263 X0811  cha     2
11  3158 X0603  cha     2
12  5503 NULL   alf     0
12  8533 X1705  ben     0
12  3158 X0603  cha     2
12  2716 X0608  cha     1
12  5263 X0811  cha     2
13  8731 NULL   alf     0
13  8732 X1705  ben     0
13  4407 X1307  cha     1
14  8247 NULL   alf     0
14  7128 X1705  ben     0
14  5535 X1403  cha     1
14  7281 X9812  cha     0

и я хотел бы получить сводную таблицу

id,no1,no2,name,state,no1,no2,name,state,no1,no2,name,state,no1,no2,name,state, …
--------------------------------------------------------------------------------
12,5503,NULL,alf,0,8533,X1705,ben,0,3158,X0603,cha,2,2716,X0608,5263,X0811,cha,2
13,8731,NULL,alf,0,8732,X1705,ben,0,4407,X1307,cha,1
14,8247,NULL,alf,0,7128,X1705,ben,0,5535,X1403,cha,1,7281,X9812,cha,0

существует # всегда одно "имя" с "alf" и "ben" для каждого идентификатора но может быть до макс. 4 записи в «имя» с «ча»

так что в основном я хочу "сгруппировать" наборы данных на основе столбца "ID", который не является идентификатором для каждого набора данных. но у меня нет int, только uniqueidentifier (не показан в этом примере), и я не вижу ни одного столбца, где я могу использовать агрегатную функцию, такую ​​как "sum" или "avg". могу / должен ли я использовать "макс"? это вообще возможно с Pivot?

Ответы [ 2 ]

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

Я не вижу логики для использования PIVOT здесь. Кажется, вам нужно просто реструктурировать данные по строкам по id. Я бы сделал это:

WITH
  s1 AS (SELECT * FROM sample WHERE name = 'alf')
, s2 AS (SELECT * FROM sample WHERE name = 'ben')
, sc AS (SELECT *, rn = row_number() over( partition by id, name order by (SELECT NULL) )
    from sample WHERE name = 'cha')
, s3 AS (SELECT * FROM sc WHERE rn = 1)
, s4 AS (SELECT * FROM sc WHERE rn = 2)
, s5 AS (SELECT * FROM sc WHERE rn = 3)

SELECT s1.* 
    , s2.no1, s2.no2, s2.name, s2.state
    , s3.no1, s3.no2, s3.name, s3.state
    , s4.no1, s4.no2, s4.name, s4.state
    , s5.no1, s5.no2, s5.name, s5.state
    FROM s1
      LEFT JOIN s2 ON s1.id = s2.id
      LEFT JOIN s3 ON s1.id = s3.id
      LEFT JOIN s4 ON s1.id = s4.id
      LEFT JOIN s5 ON s1.id = s5.id
;
0 голосов
/ 27 апреля 2018

вы можете использовать запрос, как показано ниже; Я использовал PARSENAME, так как у вас есть только 4 имени в идентификаторе. В случае, если их больше, вам понадобится настоящая функция разделения строк

Вот и демоверсия в прямом эфире!

select 
id,
no1   =PARSENAME ([1],4),
no2   =PARSENAME ([1],3),
name  =PARSENAME ([1],2),
state =PARSENAME ([1],1),
no1   =PARSENAME ([2],4),
no2   =PARSENAME ([2],3),
name  =PARSENAME ([2],2),
state =PARSENAME ([2],1),
no1   =PARSENAME ([3],4),
no2   =PARSENAME ([3],3),
name  =PARSENAME ([3],2),
state =PARSENAME ([3],1),
no1   =PARSENAME ([4],4),
no2   =PARSENAME ([4],3),
name  =PARSENAME ([4],2),
state =PARSENAME ([4],1)
from
(
    select 
        id, 
        newcol= concat(no1,'.',no2,'.',name,'.',state),
        rn    = row_number() over( partition by id order by (select null))
    from sample
 )src
PIVOT
 ( 
     max(newcol) 
         for rn in 
             ([1],[2],[3],[4])
  )p
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...