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

Откуда: Москва
Сообщений: 12
Исходные данные:

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?
4 фев 20, 22:42    [22073160]     Ответить | Цитировать Сообщить модератору
 Re: PIVOT и DATETIME  [new]
Владислав Колосов
Member

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

Вам же нужна не произвольная дата, а номер месяца. Используйте month(p_time) и назначьте колонки от [01] до [12], затем поверните с группировкой по номеру месяца.
4 фев 20, 22:55    [22073166]     Ответить | Цитировать Сообщить модератору
 Re: PIVOT и DATETIME  [new]
RuRed
Member

Откуда: Москва
Сообщений: 12
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

Что я делаю не так?=)

Сообщение было отредактировано: 5 фев 20, 18:55
5 фев 20, 18:54    [22074142]     Ответить | Цитировать Сообщить модератору
 Re: PIVOT и DATETIME  [new]
msLex
Member

Откуда:
Сообщений: 7620
RuRed


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


его можно вставить в подзапрос
5 фев 20, 18:56    [22074144]     Ответить | Цитировать Сообщить модератору
 Re: PIVOT и DATETIME  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36639
RuRed,

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


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
5 фев 20, 18:56    [22074145]     Ответить | Цитировать Сообщить модератору
 Re: PIVOT и DATETIME  [new]
RuRed
Member

Откуда: Москва
Сообщений: 12
Благодарю=)
6 фев 20, 22:16    [22075176]     Ответить | Цитировать Сообщить модератору
 Re: PIVOT и DATETIME  [new]
RuRed
Member

Откуда: Москва
Сообщений: 12
Я решил немного дополнить тему, и усложнить задачу.

По месяцам 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), но такая форма не подходит в подзапрос...
9 фев 20, 13:15    [22076270]     Ответить | Цитировать Сообщить модератору
 Re: PIVOT и DATETIME  [new]
nullin
Member

Откуда: pullin
Сообщений: 113
RuRed,
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

Только, пожалуйста, не называйте поля именами операторов Картинка с другого сайта.
9 фев 20, 15:14    [22076302]     Ответить | Цитировать Сообщить модератору
 Re: PIVOT и DATETIME  [new]
nullin
Member

Откуда: pullin
Сообщений: 113
RuRed, или вы хотите вот так поучить?
[M1], [M2], [M3], [Q1], [M4], [M5], [M6], [Q2], [M7], [M8], [M9], [Q3], [M10], [M11], [M12], [Q4]
9 фев 20, 15:15    [22076303]     Ответить | Цитировать Сообщить модератору
 Re: PIVOT и DATETIME  [new]
RuRed
Member

Откуда: Москва
Сообщений: 12
Благодарю, этого достаточно
10 фев 20, 16:29    [22076946]     Ответить | Цитировать Сообщить модератору
 Re: PIVOT и DATETIME  [new]
RuRed
Member

Откуда: Москва
Сообщений: 12
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а.

Сообщение было отредактировано: 10 фев 20, 23:34
10 фев 20, 23:29    [22077270]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить