преобразовать одну строку в столбцы - PullRequest
3 голосов
/ 21 июня 2011

Это мой запрос.Это показывает мне результаты, как описано на скриншоте.Теперь я хочу изменить его, чтобы он отображал статуи месяца в столбцах.

DECLARE @temp TABLE
(
MonthName           VARCHAR(10),
[Year]              VARCHAR(10),
StatusTypeId        INT,
StatusTypeName      VARCHAR(50),
StatusCount         INT
)

INSERT INTO @temp
SELECT
CONVERT(varchar(3), DATENAME(month, w.ExpectedStartDate)) as MonthName,
datepart(yyyy, w.ExpectedStartDate) as [Year],
w.StatusTypeId,
st.StatusTypeName,
COUNT(ISNULL(w.StatusTypeId, 0)) AS StatusCount
FROM
Worksheet w LEFT OUTER JOIN
StatusType st ON st.StatusTypeId = w.StatusTypeId
WHERE   w.ProjectId = 20
AND CONVERT(varchar(3), DATENAME(month, w.ExpectedStartDate)) between ('feb') AND    ('mar')
GROUP BY
datepart(yyyy, w.ExpectedStartDate),
CONVERT(varchar(3), DATENAME(month, w.ExpectedStartDate)),
w.StatusTypeId,
st.StatusTypeName

SELECT  ISNULL(((CONVERT(VARCHAR(5), [Year])) + '-' + MonthName), 'Unknown') AS     MonthName,
    ISNULL(StatusTypeName, 'Unknown') AS StatusTypeName,
    StatusCount
FROM @temp

Я думаю, что это изображение хорошо описывает то, что мне нужно.

enter image description here

Пожалуйста, дайте мне знать, как я могу отсортировать его по названию месяца .. например.Янв, февраль, мар, июнь, декабрьи т.д.

Спасибо.

Ответы [ 2 ]

2 голосов
/ 21 июня 2011

Проверьте сводные таблицы;

См. http://msdn.microsoft.com/en-us/library/ms177410.aspx

Простой запрос конечного числа StatusTypeNames будет выглядеть примерно так:

SELECT * FROM 
(SELECT MonthName, StatusTypeName as attributeCol, StatusCount FROM @ResultsTable) rt 
PIVOT ( MAX(StatusCount) FOR attributeCol in ([ToBeScheduled],[Complete])) as pvt
ORDER BY MonthName

Обратите внимание на использование MAX. Если есть вероятность, что у вас будет несколько строк с одинаковой комбинацией названия месяца и статуса, вы можете использовать SUM.

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

Я пытался заставить его работать с вашим примером, но из-за того, что у меня была пара проблем, вероятно, из-за того, что у меня не было таблиц. Тем не менее, что-то вроде того, что вы ищете.

DECLARE @listCol VARCHAR(2000)
DECLARE @query VARCHAR(4000)
SELECT  @listCol = SELECT STUFF (( SELECT DISTINCT '],[' + 
                    StatusTypeName FROM @ResultsTable ORDER BY '],[' + 
                    StatusTypeName FOR XML PATH ('')), 1, 2, '') + ']'


SET @query =
'SELECT * FROM
      (SELECT MonthNameCol, StatusTypeName as attributeCol, StatusCount FROM @ResultsTable) rt
PIVOT ( MAX(StatusCount) FOR attributeCol in ('+@listCol+')) AS pvt ORDER BY MonthNameCol'

EXECUTE (@query)

Это не совсем правильно, но это отправная точка.

Удачи.

0 голосов
/ 21 июня 2011

Вы можете использовать динамический подход PIVOT, показанный в этом посте http://beyondrelational.com/blogs/madhivanan/archive/2008/08/27/dynamic-pivot-in-sql-server-2005.aspx

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