SQL Добавление # префикса - PullRequest
0 голосов
/ 02 марта 2020

У меня есть запрос на выборку, который выглядит как

Type         Cause          Impact
Enhancement  Data Transfer  Cosmetic
Enhancement  Data Transfer  User Engagement
Enhancement  Front End      Cosmetic
Enhancement  Front End      User Engagement
Question     Data Transfer  Cosmetic
Question     Front End      User Engagement
Issue        Data Transfer  Cosmetic
Issue        Front End      User Engagement

Мне нужно, чтобы запрос на выборку стал таким, как этот

Type           Cause            Impact
1.Enhancement  1.Data Transfer  11.Cosmetic
1.Enhancement  2.Data Transfer  12.User Engagement
1.Enhancement  3.Front End      13.Cosmetic
1.Enhancement  4.Front End      14.User Engagement
2.Issue        1.Data Transfer  21.Cosmetic
2.Issue        2.Front End      22.User Engagement
3.Question     1.Data Transfer  31.Cosmetic
3.Question     2.Front End      32.User Engagement

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

Я думаю, что это связано с номером строки и разделом на

Ответы [ 3 ]

1 голос
/ 02 марта 2020

Вы ищете что-то подобное?

select (dense_rank() over (order by type) || '.' || type) as ntype,
       (row_number() over (partition by type order by cause, impact)) || '.' || cause as ncause,
       (dense_rank() over (order by type) || row_number() over (partition by type order by cause, impact)) || '.' ||  impact) as nimpact
from t
order by ntype, ncause, nimpact;
0 голосов
/ 02 марта 2020

Возможно что-то вроде

SELECT 
  concat(typeInc, '.', Type) as Type,
  concat(causeInc, '.', Cause) as Cause,
  concat(typeInc, causeInc, '.', Impact) as Impact
FROM (
  SELECT 
    TypeInc = DENSE_RANK() OVER (ORDER BY Type),
    CauseInc = ROW_NUMBER() OVER (PARTITION BY Type ORDER BY Cause),
    *
  FROM tbl
  ) withInc
 ORDER by Type, Cause, Impact;

Демо на http://sqlfiddle.com/#! 18 / bbcd95 / 27/0


SQL 2008 совместимая версия

SELECT 
  typeInc + '.' + Type as Type,
  causeInc + '.' + Cause as Cause,
  typeInc + causeInc + '.' + Impact as Impact
FROM (
  SELECT 
    TypeInc = CAST(DENSE_RANK() OVER (ORDER BY Type) AS varchar(3)),
    CauseInc = CAST(ROW_NUMBER() OVER (PARTITION BY Type ORDER BY Cause) AS varchar(3)),
    *
  FROM tbl
  ) withInc
 ORDER by Type, Cause, Impact;

Демонстрация на http://sqlfiddle.com/#! 18 / bbcd95 / 29/0

0 голосов
/ 02 марта 2020

Вот мой ответ, но что-нибудь попроще?

Select t1.Type,t1.Cause,Cast(t2.rnType as VARCHAR(9))+Cast(t3.rnCause as VARCHAR(9))+'.'+t1.Impact,t1.Tickets FROM
(SELECT [Type] as Type,(Case WHEN [Cause]='' THEN 'null' ELSE [Cause] END) as Cause,(Case WHEN [Impact]='' THEN 'null' ELSE [Impact] END) as Impact,count([Id]) as Tickets FROM {SupportTicket}
GROUP BY [Type],(Case WHEN [Cause]='' THEN 'null' ELSE [Cause] END),(Case WHEN [Impact]='' THEN 'null' ELSE [Impact] END)) t1
LEFT JOIN 
(SELECT [Type] as Type,dense_rank() over (ORDER By [Type]) as rnType FROM {SupportTicket}
GROUP BY [Type]) t2
ON t1.Type=t2.Type
LEFT JOIN 
(SELECT [Type] as Type,[Cause] as Cause,dense_rank() over (PARTITION BY [Type] ORDER By [Cause]) as rnCause FROM {SupportTicket}
GROUP BY [Type],[Cause]) t3
ON t1.Type=t3.Type and t1.Cause=t3.Cause
...