2015-01-14 2 views
0

Прямо сейчас у меня есть cte, который дает мне общий объем продаж на одного продавца в месяц в длинном списке. Я хочу использовать pivot специально для того, чтобы иметь столбец на каждый месяц и продавцов, перечисленных в строках, чтобы более легко отображать общий объем продаж по каждому месяцу.Pivot with Month-YY format

QUERY:

WITH SalesCTE (Salesperson, Date, TotalSales) 
AS 
(
SELECT FirstName + ' ' + LastName AS 'SalesPerson', 
     CAST(YEAR(OrderDate) AS nvarchar(10)) + '-' + DateName(MONTH,OrderDate) AS 'Date', 
     SUM(TotalDue) 
FROM Person.Person p 
JOIN Sales.SalesOrderHeader s 
ON  p.BusinessEntityID = s.SalesPersonID 
GROUP BY FirstName, LastName, OrderDate 
) 


SELECT SalesPerson, 
     Date, 
     TotalSales 
FROM SalesCTE 
ORDER BY Date, SalesPerson 

Выход на данный момент:

David Campbell 2011-December 78223.3018 
Garrett Vargas 2011-December 10254.8552 
Jillian Carson 2011-December 52586.674 
José Saraiva 2011-December 119678.9211 
Linda Mitchell 2011-December 6167.1672 
Michael Blythe 2011-December 71792.8437 

В идеале я хочу это:

    December-11 January-12 February-12  …. 
David Campbell 78223.3018 73343.3652 77431.389 
Garrett Vargas 10254.8552 176300.293 46954.6224 
Jillian Carson 52586.674 300998.1522 158997.3466 
José Saraiva 119678.9211 180684.8446 182343.3114 
Linda Mitchell 6167.1672 305145.2225 205684.0069 

T здесь много других месяцев и продавцов в списке, и я раньше ничего подобного не делал. Посмотрел развороты на несколько часов, но не мог понять, как они работают.

+2

Вы пытались решить это самостоятельно? Если да, отправьте свой код вместе с любыми ошибками или результатами, которые он производит. Таким образом, пользователи могут идентифицировать и научить вас, что не так с вашей попыткой, а не дать вам решение, которое вы не можете понять. На сайте есть много примеров [cte's with pivots] (http://stackoverflow.com/search?q=%5Bsql-server%5D%5Bcte%5D+pivot), которые должны помочь вам с этим запрос, если нет. – Tanner

ответ

1

Вставьте таблицу новый столбец с исходной датой для новой временной таблицы

SELECT *,CAST(DATES+'-01' AS DATE) ORGDATE 
INTO #NEWTABLE 
FROM TEMP 

Теперь объявить переменную, чтобы получить столбцы для поворота динамически

DECLARE @cols NVARCHAR (MAX) 

SELECT @cols = COALESCE (@cols + ',[' + DATENAME(MONTH,ORGDATE)+'-'+RIGHT(CAST(YEAR(ORGDATE) AS 
       VARCHAR(4)),2) + ']', 
       '[' + DATENAME(MONTH,ORGDATE)+'-'+RIGHT(CAST(YEAR(ORGDATE) AS VARCHAR(4)),2) + ']') 
       FROM (SELECT DISTINCT ORGDATE,[DATES] FROM #NEWTABLE) PV 
       ORDER BY ORGDATE 

Теперь сделать стержень

DECLARE @query NVARCHAR(MAX) 
SET @query = 'SELECT * FROM 
      (
       SELECT NAME, DATENAME(MONTH,ORGDATE)+''-''+RIGHT(CAST(YEAR(ORGDATE)AS VARCHAR(4)),2) logdate, value 
       FROM #NEWTABLE 
      ) x 
      PIVOT 
      (
       SUM(value) 
       FOR logdate IN (' + @cols + ') 
      ) p;' 

EXEC SP_EXECUTESQL @query 
+1

Какой смысл создавать временную таблицу? Это кажется совершенно ненужным. – Taryn

+0

Да. Ты прав. Кажется, что ОП представляет собой новую, которая может поворачиваться (как он упоминал в вопросе). Поэтому я подумал, что ему будет легко читать :) @ bluefeet ♦ –