Вопрос

У меня есть таблица со столбцами sales(int), month(int).Я хочу получить сумму продаж, соответствующую каждому месяцу.Мне нужен вывод в виде 12 столбцов, соответствующих каждому месяцу, в котором будет одна запись, содержащая продажи для каждого столбца (месяца).

Это было полезно?

Решение

Вам следует взглянуть на ПОВОРОТ для переключения строк со столбцами.Это предотвращает создание выписки select для каждого месяца.Что - то вроде этого:

DECLARE @salesTable TABLE
(
    [month] INT,
    sales INT
)

-- Note that I use SQL Server 2008 INSERT syntax here for inserting
-- multiple rows in one statement!
INSERT INTO @salesTable
VALUES (0, 2) ,(0, 2) ,(1, 2) ,(1, 2) ,(2, 2)
      ,(3, 2) ,(3, 2) ,(4, 2) ,(4, 2) ,(5, 2)
      ,(6, 2) ,(6, 2) ,(7, 2) ,(8, 2) ,(8, 2)
      ,(9, 2) ,(10, 2) ,(10, 2) ,(11, 2) ,(11, 2)

SELECT [0], [1], [2], [3], [4], [5], [6], [7], [8], [9], [10], [11]
FROM
(
    SELECT [month], sales
    FROM @salesTable
) AS SourceTable
PIVOT
(
    SUM(sales)
    FOR [month] IN ([0], [1], [2], [3], [4], [5], [6], [7], [8], [9], [10], [11])
) AS PivotTable

Другие советы

Некрасиво...но это работает хорошо

SELECT
    (SELECT SUM(Sales) FROM SalesTable WHERE [Month] = 1) [Sales1],
    (SELECT SUM(Sales) FROM SalesTable WHERE [Month] = 2) [Sales2],
    (SELECT SUM(Sales) FROM SalesTable WHERE [Month] = 3) [Sales3],
    (SELECT SUM(Sales) FROM SalesTable WHERE [Month] = 4) [Sales4],
    (SELECT SUM(Sales) FROM SalesTable WHERE [Month] = 5) [Sales5],
    (SELECT SUM(Sales) FROM SalesTable WHERE [Month] = 6) [Sales6],
    (SELECT SUM(Sales) FROM SalesTable WHERE [Month] = 7) [Sales7],
    (SELECT SUM(Sales) FROM SalesTable WHERE [Month] = 8) [Sales8],
    (SELECT SUM(Sales) FROM SalesTable WHERE [Month] = 9) [Sales9],
    (SELECT SUM(Sales) FROM SalesTable WHERE [Month] = 10) [Sales10],
    (SELECT SUM(Sales) FROM SalesTable WHERE [Month] = 11) [Sales11],
    (SELECT SUM(Sales) FROM SalesTable WHERE [Month] = 12) [Sales12]

Вот альтернативный способ написания сводки, который дает вам немного больше контроля (особенно над именами столбцов).Кроме того, для него немного проще генерировать динамический SQL.

Это похоже на ответ Робина, но имеет то преимущество, что ударяет по столу только один раз:

select
  Sales1 = sum( case when Month = 1 then Sales end )
, Sales2 = sum( case when Month = 2 then Sales end )
, Sales3 = sum( case when Month = 3 then Sales end )
-- etc..
from SalesTable;

Я провел некоторое расследование, и похоже, что новый оператор pivot - это просто синтаксический сахар для этого типа запросов.Планы запросов в конечном итоге выглядят идентично.

Интересно отметить, что оператор unpivot, похоже, также является просто синтаксическим сахаром.Например:

Если у вас есть таблица, подобная:

Create Table Sales ( JanSales int, FebSales int, MarchSales int...)

Вы можете написать:

 select unpivoted.monthName, unpivoted.sales
 from Sales s
 outer apply (
    select 'Jan', JanSales union all
    select 'Feb', FebSales union all
    select 'March', MarchSales
 ) unpivoted( monthName, sales );

И получите неотправленные данные...

Вы можете сделать это с помощью OLAP. Здесь это еще одна ссылка на документацию MSDN по этой теме.

С помощью OLAP вы можете создать куб с имеющейся у вас информацией и с нужным вам макетом.

Если вы не хотите идти этим путем, вам придется создавать сводные таблицы с помощью .NET, Java, TransacSQL или вашего предпочтительного языка для манипулирования данными SQLServer.

Чтобы легко преобразовать столбцы в строки с их названиями, вы должны использовать XML.В моем блоге я описал это на примере: Ссылка

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top