Как преобразовать строки в столбец в T-SQL и записать его во временную таблицу? - PullRequest
4 голосов
/ 16 января 2012

Этот вопрос, возможно, уже задан.

Мой запрос

SELECT Year, Month, Line, SUM(value) as total FROM myTable

У меня есть следующая таблица результатов запроса:

Year  Month   Line     Total
-------------------------------------------
2011     2      B1     5203510.00
2011     3      B1     2228850.00
2011     4      B1     7258075.00
2011     5      B1     6305370.00
2011     6      B1     5540180.00
2011     7      B1     7624430.00
2011     8      B1     4042300.00
2011     9      B1     3308870.00
2011    10      B1     4983875.00
2011    11      B1     4636500.00
2011    12      B1     3987350.00
2012     1      B1      518400.00

Мне бы хотелось следующее:

Year Line  Jan    Feb   Mar   Apr ..... December

2011 B1      0    52035  2228 725 ..... 3987350
2012 B1     51840 ... ... .... 

Пожалуйста, можете ли вы помочь мне, как перевести запрос SQL из строк в столбцы?

Ответы [ 3 ]

5 голосов
/ 16 января 2012

По сути, вам нужно PIVOT ваши данные.Есть несколько примеров того, как это сделать.Сложная задача - преобразовать month number в month name.

Это выполняется в примере с DATENAME(month, DateAdd(month, [Month], 0)-1)

SQL-оператором

SELECT  *
FROM    ( 
          SELECT  Year, Line, Total, mnt = DATENAME(month, DateAdd(month, [Month], 0)-1)
          FROM    myTable
        ) mt          
PIVOT   (MAX(Total) FOR [mnt] IN ([January],[February],[March],[April],[May],[June],[July],[August],[September],[October],[November],[December])) AS PVT

Тестовый скрипт

;WITH myTable AS (
  SELECT * FROM (VALUES
    (2011     , 2      , 'B1',      5203510.00)
    , (2011     , 3      , 'B1',      2228850.00)
    , (2011     , 4      , 'B1',      7258075.00)
    , (2011     , 5      , 'B1',      6305370.00)
    , (2011     , 6      , 'B1',      5540180.00)
    , (2011     , 7      , 'B1',      7624430.00)
    , (2011     , 8      , 'B1',      4042300.00)
    , (2011     , 9      , 'B1',      3308870.00)
    , (2011    , 10      , 'B1',      4983875.00)
    , (2011    , 11      , 'B1',      4636500.00)
    , (2011    , 12      , 'B1',      3987350.00)
    , (2012     , 1      , 'B1',       518400.00)
  ) AS myTable (Year, Month, Line, Total)
)  
SELECT  *
FROM    ( 
          SELECT  Year, Line, Total, mnt = DATENAME(month, DateAdd(month, [Month], 0)-1)
          FROM    myTable
        ) mt          
PIVOT   (MAX(Total) FOR [mnt] IN ([January],[February],[March],[April],[May],[June],[July],[August],[September],[October],[November],[December])) AS PVT
2 голосов
/ 16 января 2012

То, что вы пытаетесь сделать, это повернуть данные.Я просто буду использовать столбцы «Месяц» и «Всего» (релевантные).

Если вы используете MS SQL 2008 или выше:

SELECT [1] AS Jan, [2] AS Feb, .. [12] AS Dec,
       Total
FROM ( SELECT Month, Total FROM tableA ) AS SOURCE
PIVOT
( MAX(Total) AS Total
  FOR
  Month IN ([1],[2],...[12]) ) AS PIVOT
0 голосов
/ 16 января 2012

PIVOT - ключевое слово T-SQL, которое вы ищете.

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