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

Для одного поля делаю:
Код: 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
Период между сообщениями больше года.
PIVOT
    #39933299
hex10
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И снова здравствуйте))

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

Код: 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
PIVOT
    #39933302
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hex10,

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

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

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

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


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

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

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

Unpivot + pivot
...
Рейтинг: 0 / 0
PIVOT
    #39933516
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
PIVOT
    #39933522
nullin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
PIVOT
    #39933529
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
9 сообщений из 9, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / PIVOT
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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