powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / PIVOT и DATETIME
11 сообщений из 11, страница 1 из 1
PIVOT и DATETIME
    #39922527
Фотография RuRed
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Исходные данные:

CREATE database pivot_test
GO

USE pivot_test
GO


CREATE TABLE test1(
[id] int NULL,
[name_guest] nvarchar(20) NULL,
[p_time] datetime not null default getdate(),
[sum] int NOT NULL
);
GO
В таблице есть имя гостя и сумма. Ну скажем Иванов И.И , Петров П.П. Боширов И.В. :)


Уважаемые коллеги! Вопрос: как с помощью PIVOT найти сумму которую Иванов, Петров, Боширов заплатили за март апрель, май, июнь? Работает ли PIVOT с таким типом данных как DATETIME?
...
Рейтинг: 0 / 0
PIVOT и DATETIME
    #39922530
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RuRed,

Вам же нужна не произвольная дата, а номер месяца. Используйте month(p_time) и назначьте колонки от [01] до [12], затем поверните с группировкой по номеру месяца.
...
Рейтинг: 0 / 0
PIVOT и DATETIME
    #39923071
Фотография RuRed
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SELECT [name], [01], [02] ,[03], [04], [05] ,[06], [07], [08], [09], [10], [11], [12]
FROM test1
PIVOT (SUM(summa) FOR month(p_time) IN ([01], [02] ,[03], [04], [05] ,[06], [07], [08], [09], [10], [11], [12])) AS PIVOTtable

Не работает =)
DATEPART(month, s_time) после FOR тоже

datepart нельзя вставить после FOR

Что я делаю не так?=)
...
Рейтинг: 0 / 0
PIVOT и DATETIME
    #39923073
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RuRed


datepart нельзя вставить после FOR


его можно вставить в подзапрос
...
Рейтинг: 0 / 0
PIVOT и DATETIME
    #39923074
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RuRed,

RuReddatepart нельзя вставить после FOR

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
SELECT [name], [01], [02] ,[03], [04], [05] ,[06], [07], [08], [09], [10], [11], [12]
FROM (  
    select
        *
        , p_time_month = month(p_time)
    from test1 a
) a
PIVOT (SUM(summa) FOR p_time_month IN ([01], [02] ,[03], [04], [05] ,[06], [07], [08], [09], [10], [11], [12])) AS PIVOTtable
...
Рейтинг: 0 / 0
PIVOT и DATETIME
    #39923687
Фотография RuRed
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Благодарю=)
...
Рейтинг: 0 / 0
PIVOT и DATETIME
    #39924361
Фотография RuRed
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я решил немного дополнить тему, и усложнить задачу.

По месяцам PIVOT справился отлично:

SELECT [name], [01], [02] ,[03], [04], [05] ,[06], [07], [08], [09], [10], [11], [12]
FROM (
select
*
, p_time_month = month(p_time)
from test1 a
) a
PIVOT (SUM(summa) FOR p_time_month IN ([01], [02] ,[03], [04], [05] ,[06], [07], [08], [09], [10], [11], [12])) AS PIVOTtable

.


А вот как поступить, если нужно разделить агрегатную функцию не по месяцам, а по кварталам, при этом использовать PIVOT?
Тогда как в случае с month(p_time) , quarter(p_time) работать не будет, а будет иметь следующую форму DATEPART(quarter, p_time), но такая форма не подходит в подзапрос...
...
Рейтинг: 0 / 0
PIVOT и DATETIME
    #39924382
nullin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
RuRed,
Код: sql
1.
2.
3.
4.
5.
6.
7.
SELECT p.[id], p.[y], p.[01], p.[02], p.[03], p.[04]
  FROM (select a.id, a.name_guest, a.[sum]
             , Year(a.p_time) as y /*разбивка кварталов по годам, но: если нужна разбивка по кварталам вообще %), то убрать*/
             , p_time_quarter = datepart(quarter, a.p_time)
          from test1 a) b
 PIVOT (SUM(b.[sum])
   FOR b.p_time_quarter IN ([01], [02] ,[03], [04])) p


Только, пожалуйста, не называйте поля именами операторов
...
Рейтинг: 0 / 0
PIVOT и DATETIME
    #39924383
nullin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
RuRed, или вы хотите вот так поучить?
[M1], [M2], [M3], [Q1], [M4], [M5], [M6], [Q2], [M7], [M8], [M9], [Q3], [M10], [M11], [M12], [Q4]
...
Рейтинг: 0 / 0
PIVOT и DATETIME
    #39924749
Фотография RuRed
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Благодарю, этого достаточно
...
Рейтинг: 0 / 0
PIVOT и DATETIME
    #39924969
Фотография RuRed
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RuRed,

Единственное что в этом скрипте нашел ошибку,

SELECT [name], [01], [02] ,[03], [04], [05] ,[06], [07], [08], [09], [10], [11], [12]
FROM (
select
*
, p_time_month = month(p_time)
from test1 a
) a
PIVOT (SUM(summa) FOR p_time_month IN ([01], [02] ,[03], [04], [05] ,[06], [07], [08], [09], [10], [11], [12])) AS PIVOTtable



в подзапросе вместо звездочки нужно перечислить столбцы, при этом указать перед ними букву А как в примере a.id, a.name_guest. И только тогда результат будет выдавать нужное количество строк, например у меня их 40.
По этой же причине p_time_quarter = datepart(quarter, a.p_time) не работал квартал.

Еще раз благодарю NULLINа.
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / PIVOT и DATETIME
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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