Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / PIVOT / 9 сообщений из 9, страница 1 из 1
21.12.2007, 09:36
    #35025276
hex10
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PIVOT
Есть таблица Месяц, дата, сумма, количество.

Для одного поля делаю:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
Select
Дата, [Январь] 
from (
		Select
		Дата, Месяц, Сумма
		From
			TABLE
) as  A
PIVOT (sum(Сумма) FOR mon in ([Январь])) as B

Как ее перевернуть, чтобы получилось:
В шапке Месяц, сумма, количество, а в стоблце Дата.
Вообщем, как в PIVOT затолкать два поля - сумма и кол-во?
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
03.03.2020, 09:03
    #39933299
hex10
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PIVOT
И снова здравствуйте))

На чем мы остановились?))

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
create table Table1 
(
[date] varchar(10),--дата
[period] varchar(255),--месяц
[summ] money,--сумма
[count] integer--количество
)

insert into Table1 ([date], [period], [summ], [count])
Select '01.01.2020', 'Январь', 100.00, 1
insert into Table1 ([date], [period], [summ], [count])
Select '02.01.2020', 'Декабрь', 200.00, 2
insert into Table1 ([date], [period], [summ], [count])
Select '03.01.2020', 'Ноябрь', 300.00, 3



Select
[date], [Январь], [Декабрь], [Ноябрь]
from (
		Select
		[date], [period], [summ]
		From
			Table1
) as  A
PIVOT (sum([summ]) FOR [period] in ([Январь], [Декабрь], [Ноябрь])) as FiELD

drop table Table1





Можно ли, используя оператор PIVOT , получать сразу два значения, а не применять LEFT JOIN ?
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
Select
	tab1.[Date],
	tab1.[Январь],
	tab2.[Январь],
	tab1.[Декабрь],
	tab2.[Декабрь],
	tab1.[Ноябрь],
	tab2.[Ноябрь]
From
	(
		Select
		1 as ID, [date], [Январь], [Декабрь], [Ноябрь]
		from (
				Select
				[date], [period], [summ]
				From
					Table1
		) as  A
		PIVOT (sum([summ]) FOR [period] in ([Январь], [Декабрь], [Ноябрь])) as FiELD
	) as tab1
LEFT JOIN 
	(
		Select
		2 as ID, [date], [Январь], [Декабрь], [Ноябрь]
		from (
				Select
				[date], [period], [count]
				From
					Table1
	) as  A
PIVOT (sum([count]) FOR [period] in ([Январь], [Декабрь], [Ноябрь])) as FiELD
) as tab2
ON tab1.date = tab2.date




...
Рейтинг: 0 / 0
03.03.2020, 09:16
    #39933302
a_voronin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PIVOT
hex10,

Прошло 12 лет как вы выучили PIVOT.

Сколько еще надо времени, чтобы вы выучили OVER (PARTITION BY ...).
...
Рейтинг: 0 / 0
03.03.2020, 12:15
    #39933433
hex10
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PIVOT
a_voronin,

Если бы выучил PIVOT, то не задавал бы здесь вопросов))
Ваш сарказм намекает, что используя PIVOT нельзя получить то, что я хочу?
...
Рейтинг: 0 / 0
03.03.2020, 12:34
    #39933458
a_voronin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PIVOT
hex10
a_voronin,

Если бы выучил PIVOT, то не задавал бы здесь вопросов))
Ваш сарказм намекает, что используя PIVOT нельзя получить то, что я хочу?


14 лет тому назад мне довелось писать универсальный движок по рассчету кросс-таблиц, по сути дело мини-куб, который мог разворачивать величины и по вертикали и по горизонтали. И класть несколько значений на пересечение как у вас.

Тогда PIVOT уже был, но я пришел к выводу, что с помощью GROUP BY, MAX и CASE WHEN можно добиться более быстрого результата? Но более громоздким запросом.

А получить то, что вы хотите можно и без PIVOT.
...
Рейтинг: 0 / 0
03.03.2020, 13:46
    #39933515
WarAnt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PIVOT
hex10,

Unpivot + pivot
...
Рейтинг: 0 / 0
03.03.2020, 13:50
    #39933516
a_voronin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PIVOT
WarAnt,

Как вы два января собрались сделать? Проще расписать партянку
Код: sql
1.
2.
3.
4.
5.
6.
7.
SELECT 
DATE, 
SUM(CASE WHEN Date = ... AND Month = .... THEN SUM(summ) ELSE 0 END) AS ЯнваряSum
SUM(CASE WHEN Date = ... AND Month = .... THEN SUM(COUNT) ELSE 0 END) AS ЯнваряCount
...
FROM ...
GROUP BY Date 
...
Рейтинг: 0 / 0
03.03.2020, 14:02
    #39933522
nullin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PIVOT
hex10, пивотил, пивотил, неперепивотил

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
select [date], [year]/*!*/, 
       sum([pvt_Январь]) as [Январь], sum([Январь]) as [Январь],
       sum([pvt_Декабрь]) as [Декабрь], sum([Декабрь]) as [Декабрь],
       sum([pvt_Ноябрь]) as [Ноябрь], sum([Ноябрь]) as [Ноябрь]
  from (select [date], [year]/*!*/, [period], [count], 
               [Январь] as [pvt_Январь], [Декабрь] as [pvt_Декабрь], [Ноябрь] as [pvt_Ноябрь]
          from (select [date], year([date]) as [year]/*!*/, [period], [summ], [period] as [pvt_period], [count]
                  from Table1) as  A
         pivot (sum([summ])
           for [pvt_period] in ([Январь], [Декабрь], [Ноябрь])) as p) as b
 pivot (sum([count])
   for [period] in ([Январь], [Декабрь], [Ноябрь])) p
 group by [date], [year]

Нейминг конечно... да и зачем вам money?

Не понимаю, зачем вы это делаете, так как делаете, но, если все же так: закомментируете year([date]) и [year] вместе.
...
Рейтинг: 0 / 0
03.03.2020, 14:16
    #39933529
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PIVOT
a_voronin
Как вы два января собрались сделать?
Легко и непринужденно.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
set language russian;

declare @t table
(
 id int identity primary key,
 record_type tinyint,
 dt datetime,
 v int
);

insert into @t
values
 (1, '20190201', 1), (1, '20190202', 2),
 (2, '20190201', 10), (2, '20190202', 20),
 (1, '20200101', 1), (1, '20200102', 2),
 (2, '20200101', 10), (2, '20200102', 20);

with t (y, x, v) as
(
 select
  year(dt), datename(month, dt) + '_' + cast(record_type as varchar(10)), v
 from
  @t
)
select
 p.y,
 p.[Январь_1] as [Январь], p.[Январь_2] as [Январь],
 p.[Февраль_1] as [Февраль], p.[Февраль_2] as [Февраль]
from
 t
pivot
(
 sum(v) for x in ([Январь_1], [Январь_2], [Февраль_1], [Февраль_2])
) p;
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / PIVOT / 9 сообщений из 9, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]