Преобразование строк в столбцы в SQL SERVER 2008 - PullRequest
0 голосов
/ 07 марта 2011

В SQL Server 2008,

У меня есть таблица для отслеживания истории действий (STATUS_HISTORY), которая имеет три столбца ([ACTION_ID],[STATUS],[STATUS_DATE]).

Каждый ACTION_ID может иметь переменное количество статусов и дат статуса.

Мне нужно преобразовать эти строки в столбцы, которые предпочтительно выглядят примерно так:

[ACTION_ID], [STATUS_1], [STATUS_2], [STATUS_3], [DATE_1], [DATE_2], [DATE_3]

Если общее количество столбцов состояния и столбцов даты неизвестно, и, конечно, DATE_1 соответствует STATUS_1 и т. Д. И я бы хотел, чтобы статус был в хронологическом порядке (STATUS_1 имеет самая ранняя дата и т. д.)

Моя причина для этого заключается в том, чтобы я мог поместить 10 самых последних статусов в отчет в ADP Access вместе с другой информацией для каждого действия. Использование подотчета с каждым статусом в новой строке может привести к тому, что отчет будет слишком большим.

Есть ли способ сделать это с помощью PIVOT? Я не хочу использовать дату или статус в качестве заголовка столбца.

Возможно ли это вообще?

Понятия не имею, с чего начать. У меня болит голова.

Ответы [ 2 ]

4 голосов
/ 07 марта 2011

Предположим для краткости, что вам нужно только 3 самых последних статуса для каждого action_id (как в вашем примере).

Тогда этот запрос с использованием CTE должен выполнить работу:

WITH rownrs AS
(
 SELECT
   action_id
  ,status
  ,status_date
  ,ROW_NUMBER() OVER (PARTITION BY action_id ORDER BY status_date DESC) AS rownr
 FROM
  status_history
)

SELECT
  s1.action_id AS action_id

 ,s1.status AS status_1
 ,s2.status AS status_2
 ,s3.status AS status_3

 ,s1.status_date AS date_1
 ,s2.status_date AS date_2
 ,s3.status_date AS date_3

FROM

(SELECT * FROM rownrs WHERE rownr=1) AS s1

 LEFT JOIN
(SELECT * FROM rownrs WHERE rownr=2) AS s2
 ON s1.action_id = s2.action_id

 LEFT JOIN
(SELECT * FROM rownrs WHERE rownr=3) AS s3
 ON s1.action_id = s3.action_id

NULL значения появятся в строках, где action_id имеет менее 3 status -ов.

1 голос
/ 07 марта 2011

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

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