powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Выборка данных за месяц с интервалом в день
7 сообщений из 7, страница 1 из 1
Выборка данных за месяц с интервалом в день
    #39282088
evil_admin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.
Возникла сложность с запросом, прошу помощи.
Есть таблица заказов
IDCreateTimeFinishTime IDUsers Cost 101-05-2016 01:00:00.00001-05-2016 01:20:00.000350201-05-2016 01:05:00.00001-05-2016 01:21:00.0002100301-05-2016 01:15:00.00001-05-2016 01:30:00.000340401-05-2016 01:16:00.00001-05-2016 01:18:00.000190501-05-2016 01:19:00.00001-05-2016 01:40:00.000170601-05-2016 01:22:00.00001-05-2016 01:35:00.000230................................................................................................100031-05-2016 23:00:00.00031-05-2016 23:20:00.000330100131-05-2016 23:05:00.00031-05-2016 23:21:00.0002150100231-05-2016 23:15:00.00031-05-2016 23:30:00.0003140
ID- номер заказа
CreateTime - время создания заказа
FinishTime - время завершения заказа
IDUsers - Номер сотрудника исполнившего заказ
Cost - стоимость заказа

На основании этих данных нужно получить отчет следующего вида если это возможно
IDUsers 1число всего заказов 1число сумма по заказам 2 число всего заказов 2 число сумма по заказам...1 540010700...28300151000...34350201500...

Запрос который показывает информацию между заданными датами, сделал.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT 
  coalesce("Orders"."IDUser", 0),
  Count("Orders"."ID"),
  sum(coalesce("Orders"."Cost", 0))
FROM 
  public."Orders"
WHERE 
  "Orders"."FinishTime" BETWEEN '01-05-2016 00:00:00.000' AND '30-06-2016 23:59:59.000'
GROUP BY  "Orders"."IDUser"



Как реализовать вывод одной таблицей суммарные данные по количеству заказов и их стоимости за каждый день по сотрудникам?
...
Рейтинг: 0 / 0
Выборка данных за месяц с интервалом в день
    #39282588
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
with Orders(ID, CreateTime, FinishTime, IDUser, Cost) as (
    values
        (1, '01-05-2016 01:00:00'::timestamp, '01-05-2016 01:20:00'::timestamp, 3, 50)
        , (1, '01-05-2016 01:00:00'::timestamp, '02-05-2016 01:20:00'::timestamp, 1, 40)
        , (1, '01-05-2016 01:00:00'::timestamp, '02-05-2016 01:20:00'::timestamp, 3, 30)
        , (1, '01-05-2016 01:00:00'::timestamp, '03-05-2016 01:20:00'::timestamp, 1, 20)
        , (1, '01-05-2016 01:00:00'::timestamp, '03-05-2016 01:20:00'::timestamp, 1, 10)
), stat_by_user_date as (
    select IDUser, FinishTime::date as finish_date, count(*) as cnt, sum(Cost) as cost_sum
    from Orders
    where FinishTime >= '01-05-2016 00:00:00'::timestamp and FinishTime < '01-06-2016 00:00:00'::timestamp
    group by 1, 2
)
select IDUser, array_agg(row(finish_date, cnt, cost_sum) order by finish_date) as user_stat_by_date
from stat_by_user_date
group by 1
order by 1
;
...
Рейтинг: 0 / 0
Выборка данных за месяц с интервалом в день
    #39282794
evil_admin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не тот результат
1"{"(2016-05-01,1,10)","(2016-05-03,1,10)"}"2"{"(2016-05-02,1,10)"}"4"{"(2016-05-04,1,10)"}"5"{"(2016-05-05,1,10)"}"
А мне надо по всем сотрудникам сколько заказов он выполнил за первый день месяца и на какую сумму, за второй и т.д.
Сотрудников много, в первом посте просто пример был на 3 чел
...
Рейтинг: 0 / 0
Выборка данных за месяц с интервалом в день
    #39283034
Фотография vyegorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
evil_admin,

Посмотрите на `crosstab()` из расширения tablefunc .
...
Рейтинг: 0 / 0
Выборка данных за месяц с интервалом в день
    #39283791
evil_admin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vyegorov,
Как построить запрос если у меня 3-и колонки разобрался
Например: ИД пользователя , Дата, Сумма выручки за дату
Но у меня 4-е колонки
ИД пользователя , Дата, Сумма выручки за день, Количество заказов за день.

01-05-2016 01-05-2016 02-05-2016 02-05-201603-05-2016 03-05-2016IDUsers Заказы Сумма Заказы Сумма Заказы Сумма

И здесь у меня проблема, в документации подобного примера не нашел.
Может временную таблицу сделать и отдельными запросами каждый день тянуть?
Как-то массивно получается, и не уверен что это правильно
...
Рейтинг: 0 / 0
Выборка данных за месяц с интервалом в день
    #39284142
Фотография Legushka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
evil_admin, в вашем примере у вас не 4 колонки. а 7 колонок-)
...
Рейтинг: 0 / 0
Выборка данных за месяц с интервалом в день
    #39284234
Фотография vyegorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
evil_admin,

Чтобы у вас было бы по 2 столбика на каждый день, нужно формировать им соответствующие наименования, как-то так:
Код: 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.
SET datestyle TO "ISO,DMY";
CREATE TABLE o AS
WITH o(id, create_dt, finish_dt, user_id, cost) AS (
  VALUES
    (1,'01-05-2016 01:00:00.000'::timestamptz,'01-05-2016 01:20:00.000'::timestamptz,3,50),
    (2,'01-05-2016 01:05:00.000','01-05-2016 01:21:00.000',2,100),
    (3,'01-05-2016 01:15:00.000','01-05-2016 01:30:00.000',3,40),
    (4,'01-05-2016 01:16:00.000','01-05-2016 01:18:00.000',1,90),
    (5,'01-05-2016 01:19:00.000','01-05-2016 01:40:00.000',1,70),
    (6,'01-05-2016 01:22:00.000','01-05-2016 01:35:00.000',2,30),
    (1000,'31-05-2016 23:00:00.000','31-05-2016 23:20:00.000',3,30),
    (1001,'31-05-2016 23:05:00.000','31-05-2016 23:21:00.000',2,150),
    (1002,'31-05-2016 23:15:00.000','31-05-2016 23:30:00.000',3,140)
)
SELECT * FROM o;

-- 
WITH g AS (
  SELECT user_id,
         to_char(create_dt,'DD') AS day,
         count(id) AS cnt,
         coalesce(sum(cost), 0) AS ttl
    FROM o
   WHERE finish_dt BETWEEN '01-05-2016 00:00:00.000' AND '30-06-2016 23:59:59.000'
   GROUP BY user_id, day
)
SELECT user_id, day||'_cnt' cat, cnt FROM g
UNION ALL
SELECT user_id, day||'_ttl' cat, ttl FROM g
ORDER BY user_id, cat;


Учитывая, что таких столбиков становиться 62, то я не совсем вижу смысл в этой трансформации — столько столбиков тяжело воспринимать.
Не проще ли остановиться на простом агрегирующими запросе, а вертеть уже в чём-то вроде Excel-а?
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Выборка данных за месяц с интервалом в день
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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