Как инвертировать строки и столбцы с помощью сводной таблицы T-SQL - PullRequest
2 голосов
/ 23 марта 2010

У меня есть запрос, который возвращает одну строку. Однако я хочу инвертировать строки и столбцы, то есть отображать строки в виде столбцов, а столбцы - в виде строк. Я думаю, что лучший способ сделать это - использовать сводную таблицу, в которой я не эксперт.

Вот мой простой запрос:

SELECT Period1, Period2, Period3
FROM GL.Actuals
WHERE Year = 2009 AND Account = '001-4000-50031'

Результаты (с заголовками):

Period1, Period2, Period3

612,58, 681,36, 676,42

Я бы хотел, чтобы результаты выглядели так:

Желаемые результаты:

Период, Сумма

Янв, 612,58

февраля, 681,36

Март, 676,42

Это простой пример, но то, что я действительно ищу, немного сложнее, чем это. Я понимаю, что мог бы получить результаты тезиса, используя вместо этого несколько команд SELECT. Я просто надеюсь, что кто-то сможет пролить свет на то, как это сделать с помощью сводной таблицы или если есть еще лучший способ.

Ответы [ 3 ]

2 голосов
/ 23 марта 2010

Для фиксированного набора полей вы можете использовать UNION операторов выбора, каждый из которых выбирает одно из полей. Стандартный SQL не предоставляет способ транспонировать результат для переменного числа полей, например select * from table.

Если в MSSQL есть расширение, которое помогает (например, pivot), я не знаю об этом.

1 голос
/ 15 марта 2012

Проверьте функцию unnest, это довольно удивительно с небольшими накладными расходами.Просто добавьте запрос на выборку поверх вложенного запроса на выборку и удалите его в этой точке:

SELECT id,
   unnest(array['a', 'b', 'c']) AS colname,
   unnest(array[a, b, c]) AS thing
FROM foo
ORDER BY id;
1 голос
/ 23 марта 2010

Попробуйте что-то вроде этого (проверено на MSSQL2008):

DECLARE @Data TABLE(Period1 Decimal(5, 2), Period2 Decimal(5, 2), Period3 Decimal(5, 2))
INSERT @Data
VALUES (612.58, 681.36, 676.42)

SELECT Period, Amount
FROM (SELECT Period1 AS Jan, Period2 AS Feb, Period3 AS Mar FROM @Data) AS D
UNPIVOT (Amount FOR Period IN (Jan, Feb, Mar)) AS U

Обновление

На основании комментария Джеффа, как насчет этого:

DECLARE @Actuals TABLE(Account INT, [Year] INT, Period1 Decimal(5, 2), Period2 Decimal(5, 2), Period3 Decimal(5, 2))
INSERT @Actuals VALUES (1, 2010, 612.58, 681.36, 676.42)
INSERT @Actuals VALUES (1, 2009, 512.58, 581.36, 576.42)

SELECT Account, Period, Amount
FROM
(
    SELECT a.Account, a.Period1 AS Jan, a.Period2 AS Feb, a.Period3 AS Mar, a1.Period1 AS Jan1, a1.Period2 AS Feb1, a1.Period3 AS Mar1
    FROM @Actuals AS a
    LEFT OUTER JOIN @Actuals AS a1 ON a.Account = a1.Account AND a1.[Year] = a.[Year] - 1
    WHERE a.[Year] = 2010
) AS d
UNPIVOT (Amount FOR Period IN (Jan, Feb, Mar, Jan1, Feb1, Mar1)) AS u

или с явным столбцом года:

DECLARE @Actuals TABLE(Account INT, [Year] INT, Period1 Decimal(5, 2), Period2 Decimal(5, 2), Period3 Decimal(5, 2))
INSERT @Actuals VALUES (1, 2010, 612.58, 681.36, 676.42)
INSERT @Actuals VALUES (1, 2009, 512.58, 581.36, 576.42)

SELECT Account, [Year], Period, Amount
FROM
(
    SELECT a.Account, a.[Year], a.Period1 AS Jan, a.Period2 AS Feb, a.Period3 AS Mar
    FROM @Actuals AS a WHERE a.[Year] IN (2009, 2010)
) AS d
UNPIVOT (Amount FOR Period IN (Jan, Feb, Mar)) AS u
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...