Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как повернуть таблицу  [new]
Tenьka
Member

Откуда:
Сообщений: 4
Добрый день! Подскажите пожалуйста как осуществить поворот, чтобы получить из таблицы 1, таблицу 2.
Пробую через PIVOT, остается только по одной строке для каждого магазина вместо двух.

Исходная таблица 1

Магазин Дата Продано
--------------------------------------
Магазин 1 01.02.2001 3
Магазин 1 01.02.2001 4
Магазин 1 02.02.2001 15
Магазин 1 02.02.2001 24
Магазин 2 01.02.2001 11
Магазин 2 01.02.2001 34
Магазин 2 02.02.2001 1
Магазин 2 02.02.2001 5

Нужно получить таблицу 2

Магазин 01.02.2001 02.02.2001
----------------------------------------------
Магазин 1 3 15
Магазин 1 4 24
Магазин 2 11 1
Магазин 2 34 5



CREATE TABLE #m(Shop nvarchar(50),[Date] datetime, Sold int)
INSERT INTO #m(Shop, [Date], Sold) VALUES('Магазин 1','01.02.2001',3)
INSERT INTO #m(Shop, [Date], Sold) VALUES('Магазин 1','01.02.2001',4)
INSERT INTO #m(Shop, [Date], Sold) VALUES('Магазин 1','02.02.2001',15)
INSERT INTO #m(Shop, [Date], Sold) VALUES('Магазин 1','02.02.2001',24)
INSERT INTO #m(Shop, [Date], Sold) VALUES('Магазин 2','01.02.2001',11)
INSERT INTO #m(Shop, [Date], Sold) VALUES('Магазин 2','01.02.2001',34)
INSERT INTO #m(Shop, [Date], Sold) VALUES('Магазин 2','02.02.2001',1)
INSERT INTO #m(Shop, [Date], Sold) VALUES('Магазин 2','02.02.2001',5)

SELECT Shop, [01.02.2001], [02.02.2001]
FROM #m
PIVOT
(MIN(Sold) FOR [Date] IN ([01.02.2001], [02.02.2001])) p

К сообщению приложен файл. Размер - 29Kb
24 мар 20, 14:39    [22105102]     Ответить | Цитировать Сообщить модератору
 Re: Как повернуть таблицу  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30701
Tenьka
Пробую через PIVOT, остается только по одной строке для каждого магазина вместо двух.
Можно так:
SELECT Shop, [01.02.2001], [02.02.2001]
FROM (
	SELECT Shop, [Date], Sold, row_number() over(partition by Shop, [Date] order by Sold) as num
	FROM #m
) t
PIVOT
(MIN(Sold) FOR [Date] IN ([01.02.2001], [02.02.2001])) p
order by Shop


Хотя такое разделение странно, нужно же, что бы в строках поля Shop, [Date] были дополнены каким то атрибутом, делающим этот набор уникальным (например, утренние или вечерние продажи, или что то такое)
24 мар 20, 15:26    [22105142]     Ответить | Цитировать Сообщить модератору
 Re: Как повернуть таблицу  [new]
Tenьka
Member

Откуда:
Сообщений: 4
alexeyvg,

Спасибо большое!

А если делать реализацию через групповые операции:

SELECT Shop,
MIN(CASE [Date] WHEN '01.02.2001' THEN Sold ELSE NULL END) '01.02.2001',
MIN(CASE [Date] WHEN '02.02.2001' THEN Sold ELSE NULL END) '02.02.2001'
FROM #m
GROUP BY Shop

этот запрос так же возвращает только по 1 строке

возможно ли получить данные при группировке в виде таблицы 2?
24 мар 20, 16:04    [22105173]     Ответить | Цитировать Сообщить модератору
 Re: Как повернуть таблицу  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30701
Tenьka
А если делать реализацию через групповые операции:

этот запрос так же возвращает только по 1 строке

возможно ли получить данные при группировке в виде таблицы 2?
Да, таким же способом.
24 мар 20, 16:07    [22105177]     Ответить | Цитировать Сообщить модератору
 Re: Как повернуть таблицу  [new]
Tenьka
Member

Откуда:
Сообщений: 4
alexeyvg,

Спасибо Вам еще раз большое!

Получилось вот так:


SELECT t.Shop,
MIN(CASE [Date] WHEN '01.02.2001' THEN Sold ELSE NULL END) '01.02.2001',
MIN(CASE [Date] WHEN '02.02.2001' THEN Sold ELSE NULL END) '02.02.2001'
FROM (
SELECT Shop, [Date], Sold, row_number() over(partition by Shop, [Date] order by Sold) as num
FROM #m
) t
GROUP BY t.Shop, num
ORDER BY Shop
24 мар 20, 16:14    [22105182]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить