powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Найти суммарные продажи за день, усредненные до продаж с 1 по 4 и с 5 по 7.
21 сообщений из 21, страница 1 из 1
Найти суммарные продажи за день, усредненные до продаж с 1 по 4 и с 5 по 7.
    #39357857
Rust_Cohle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день, коллеги!
Я всего лишь новичок в sql. Столкнулся с задачкой, условие которой в принципе полностью описано в заголовке.
Насколько я понимаю, подобного рода задачи решаются с использование аналитических функций.
Я представляю себе решение так:
Код: sql
1.
2.
3.
4.
5.
6.
Select ....
case 
	when d.WEEK_DAY_NUM between 1 and 4 then avg(sum(sale_sum)) over (partition by WEEK_DAY_NUM ,SHOP, TYPE order by week_day_num ) 
	when d.WEEK_DAY_NUM between 5 and 7 then avg(sum(sale_sum)) over (partition by WEEK_DAY_NUM ,SHOP, TYPE order by week_day_num )
end as AVERAGE 
...


P.S. WEEK_DAY_NUM - номер дня недели(от 1 до 7)
У меня предчувствие, что кейс тут и не нужен, просто необходимо корректно задать интервал после "order by week_day_num", а вот как это сделать пока не пойму. И еще можно ли таким способом вычислять среднюю сумму?
Помогите пл3 люди добрые!)
...
Рейтинг: 0 / 0
Найти суммарные продажи за день, усредненные до продаж с 1 по 4 и с 5 по 7.
    #39357860
Glays
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Rust_Cohle, я не понял.
...
Рейтинг: 0 / 0
Найти суммарные продажи за день, усредненные до продаж с 1 по 4 и с 5 по 7.
    #39357864
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Rust_CohleСтолкнулся с задачкой, условие которой в принципе полностью описано в заголовке.Это не условие, это всего лишь попытка его интерпретации в sql-код. Мы не телепаты. Помимо собственно постановки задачи не поленись привести пример исходных данных через with и пример результата
...
Рейтинг: 0 / 0
Найти суммарные продажи за день, усредненные до продаж с 1 по 4 и с 5 по 7.
    #39357890
Rust_Cohle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Прошу прощения. Пишу полностью всю задачу, с исходными данными.

: Задача
Исходные данные:
Представление с продажами V_SALE следующей структуры
DAY_ID -- День продажи, тип дата
SHOP -- Магазин
ART_ID -- Товар
TYPE-- Тип (1, 2, 3) --зависит от магазина
SALE_SUM - Сумма продажи
Первые три поля являются уникальным ключом
Строк с нулевыми продажами в таблице нет.

Представление дней недели V_DAY
DAY_ID - День, тип дата
WEEK_DAY_NUM - Номер для недели в числовом формате Понедельник = 1, воскресенье = 7
WEEK_ID - Номер года и недели в года в формате 201532

Задача:
Необходимо по каждому магазину проанализировать продажи за 32, 33 неделю 2015 года
и получить на выходе следующие поля
День, когда в магазине отсутствуют продажи можно не учитывать при рассчете средней.
Сделать за одно обращение к таблице V_SALE в одном запросе, без использования
Common table expression (конструкция with)

Список полей:
Номер недели - Группируемое
Магазин - Группируемое
Формат - Группируемое
Суммарные продажи за анализируемый период
Суммарные продажи за день на магазине усредненные до продаж с понедельника по четверг
Суммарные продажи за день на магазине усредненные до продаж с пятницы по воскресенье.


Я не могу понять только как последние два подчеркнутых пункта вывести:(
...
Рейтинг: 0 / 0
Найти суммарные продажи за день, усредненные до продаж с 1 по 4 и с 5 по 7.
    #39357903
Rust_Cohle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пока что мой запрос имеет такой вид. Но он недоработан(
:запрос
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
select distinct WEEK_DAY_NUM, SHOP, TYPE, sum(sale_sum) over() as SUM_WEEK
,case 
	when d.WEEK_DAY_NUM between 1 and 4 then avg(sale_sum) over (partition by WEEK_DAY_NUM ,SHOP, TYPE order by week_day_num) 
	when d.WEEK_DAY_NUM between 5 and 7 then avg(sale_sum) over (partition by WEEK_DAY_NUM ,SHOP, TYPE order by week_day_num) 
end as AVERAGE 
from V_SALE s
left join V_DAY d ON d.day_id=s.day_id
where WEEK_ID in ('201532','201533')


...
Рейтинг: 0 / 0
Найти суммарные продажи за день, усредненные до продаж с 1 по 4 и с 5 по 7.
    #39357907
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Rust_Cohle,

Если я правильно понимаю условие задачи, то аналитика тут не нужна. Хватит и группировки:
Код: plsql
1.
2.
3.
avg(case WEEK_DAY_NUM between 1 and 4 then sale_sum end),
avg(case WEEK_DAY_NUM between 5 and 7 then sale_sum end)
group by WEEK_ID
...
Рейтинг: 0 / 0
Найти суммарные продажи за день, усредненные до продаж с 1 по 4 и с 5 по 7.
    #39357920
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Rust_Cohle,
не то?
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
  1  with t (D, sale_sum) as (
  2    select sysdate,10 from dual union all
  3    select sysdate,30 from dual union all
  4    select sysdate+1,10 from dual union all
  5    select sysdate+2,20 from dual union all
  6    select sysdate+3,30 from dual union all
  7    select sysdate+4,40 from dual union all
  8    select sysdate+5,50 from dual union all
  9    select sysdate+6,60 from dual union all
 10    select sysdate+7,70 from dual union all
 11    select sysdate+8,10 from dual )
 12  , sale as (select d,to_char(d,'d') w, sale_sum from t)
 13  select
 14   avg(case when W between 1 and 4 then sum(sale_sum) end ) avg_14
 15  ,avg(case when W between 5 and 5 then sum(sale_sum) end ) avg_57
 16* from sale group by d,w
SQL> /

    AVG_14     AVG_57
---------- ----------
        40         20


.....
stax
...
Рейтинг: 0 / 0
Найти суммарные продажи за день, усредненные до продаж с 1 по 4 и с 5 по 7.
    #39357933
Rust_Cohle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
stax..,
В условии задачи "... Сделать за одно обращение к таблице V_SALE в одном запросе, без использования
Common table expression (конструкция with)
"
...
Рейтинг: 0 / 0
Найти суммарные продажи за день, усредненные до продаж с 1 по 4 и с 5 по 7.
    #39357944
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Rust_Cohlestax..,
В условии задачи "... Сделать за одно обращение к таблице V_SALE в одном запросе, без использования
Common table expression (конструкция with)
"Ответивший тебе и сделал одно обращение к V_SALE, в with вынес ее для декларации, только потому что автор темы поленился/оказался не способным самостоятельно привести пример исходных данных.
...
Рейтинг: 0 / 0
Найти суммарные продажи за день, усредненные до продаж с 1 по 4 и с 5 по 7.
    #39357949
Фотография --Eugene--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Rust_Cohle Сделать за одно обращение к таблице V_SALE в одном запросе, без использования
Common table expression (конструкция with)
че за бред??
опять какой-то олдфаг-style teacher отрывается?
...
Рейтинг: 0 / 0
Найти суммарные продажи за день, усредненные до продаж с 1 по 4 и с 5 по 7.
    #39357969
Rust_Cohle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AmKadRust_Cohle,

Если я правильно понимаю условие задачи, то аналитика тут не нужна. Хватит и группировки:
Код: plsql
1.
2.
3.
avg(case WEEK_DAY_NUM between 1 and 4 then sale_sum end),
avg(case WEEK_DAY_NUM between 5 and 7 then sale_sum end)
group by WEEK_ID


Я же говорю - я новичок, такими приёмами пока не владею!)Я же вроде дал примерный набор исходных данных в описании задачи.
Ваше предложение через обычную группировку по сути делает то же самое, что и мой запрос. Только теперь как вывести общую сумму за две недели? По условию задачи, необходимо же произвести группировку по трем конкретным полям. Разве обычный Group by способен на такое? Заранее прошу прощение за нубские вопросы)
...
Рейтинг: 0 / 0
Найти суммарные продажи за день, усредненные до продаж с 1 по 4 и с 5 по 7.
    #39357972
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Rust_CohleТолько теперь как вывести общую сумму за две недели?Разве это есть в постановке задачи?
...
Рейтинг: 0 / 0
Найти суммарные продажи за день, усредненные до продаж с 1 по 4 и с 5 по 7.
    #39357982
Rust_Cohle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AmKad,
Необходимо по каждому магазину проанализировать продажи за 32, 33 неделю 2015 года
и получить на выходе следующие поля
Список полей:
Номер недели - Группируемое
Магазин - Группируемое
Формат - Группируемое
Суммарные продажи за анализируемый период
Суммарные продажи за день на магазине усредненные до продаж с понедельника по четверг
Суммарные продажи за день на магазине усредненные до продаж с пятницы по воскресенье.

Вот.
...
Рейтинг: 0 / 0
Найти суммарные продажи за день, усредненные до продаж с 1 по 4 и с 5 по 7.
    #39357984
Фотография --Eugene--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AmKadХватит и группировки:
Код: plsql
1.
2.
3.
avg(case WEEK_DAY_NUM between 1 and 4 then sale_sum end),
avg(case WEEK_DAY_NUM between 5 and 7 then sale_sum end)
group by WEEK_ID

Тогда уж лучше так
Код: plsql
1.
2.
3.
4.
select
(select avg(sale_sum) from ... where week_day_num between 1 and 4),
(select avg(sale_sum) from ... where week_day_num between 5 and 7)
from dual

может week_day_num проиндексировано.. )
...
Рейтинг: 0 / 0
Найти суммарные продажи за день, усредненные до продаж с 1 по 4 и с 5 по 7.
    #39357989
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
--Eugene--AmKadХватит и группировки:
Код: plsql
1.
2.
3.
avg(case WEEK_DAY_NUM between 1 and 4 then sale_sum end),
avg(case WEEK_DAY_NUM between 5 and 7 then sale_sum end)
group by WEEK_ID

Тогда уж лучше так
Код: plsql
1.
2.
3.
4.
select
(select avg(sale_sum) from ... where week_day_num between 1 and 4),
(select avg(sale_sum) from ... where week_day_num between 5 and 7)
from dual

может week_day_num проиндексировано.. )Я привел только часть запроса, который не аналогичен твоему.
...
Рейтинг: 0 / 0
Найти суммарные продажи за день, усредненные до продаж с 1 по 4 и с 5 по 7.
    #39357998
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Rust_CohleСуммарные продажи за анализируемый периодЯ не случайно прошу (или требую) таких как ты привести пример исходных данных и желаемого результата, не только потому что мне в лом самому набивать тестовые данные, но и потому, что без этого далеко не каждому удается дать однозначную постановку. Вот например, выделенное мною предложение можно трактовать как:
сумму за неделю целиком
или
сумму за две недели целиком.

Если первое (что вероятнее) - то все в рамках группировки. Если второе, то аналитика поверх группировки. Если первое + второе, то rollup.
...
Рейтинг: 0 / 0
Найти суммарные продажи за день, усредненные до продаж с 1 по 4 и с 5 по 7.
    #39358001
Rust_Cohle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AmKadRust_CohleСуммарные продажи за анализируемый периодЯ не случайно прошу (или требую) таких как ты привести пример исходных данных и желаемого результата, не только потому что мне в лом самому набивать тестовые данные, но и потому, что без этого далеко не каждому удается дать однозначную постановку. Вот например, выделенное мною предложение можно трактовать как:
сумму за неделю целиком
или
сумму за две недели целиком.

Если первое (что вероятнее) - то все в рамках группировки. Если второе, то аналитика поверх группировки. Если первое + второе, то rollup.
Проблема в том, что у меня нет этих данных, у меня есть только задание с листочка бумаги, которое я привел дословно, мне тоже не все однозначно понятно из условия. И предполагается что умный специалист, у которого есть опыт, без какой-либо базы возьмет в голове все это представит и выдаст решение. Лично я у себя попытался примерно задать в базе набор некоторых данных, то как я себе представляю это должно выглядеть. И сижу мучаю эту задачу. Каким образом тебе скинуть мои таблицы, я не представляю.
...
Рейтинг: 0 / 0
Найти суммарные продажи за день, усредненные до продаж с 1 по 4 и с 5 по 7.
    #39358004
Rust_Cohle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AmKad выделенное мною предложение можно трактовать как:
сумму за неделю целиком
или
сумму за две недели целиком.

Если первое (что вероятнее) - то все в рамках группировки. Если второе, то аналитика поверх группировки. Если первое + второе, то rollup.
Очевидно раз требуется анализ данных за 32,33 неделю, то и сумма требуется за обе недели.
...
Рейтинг: 0 / 0
Найти суммарные продажи за день, усредненные до продаж с 1 по 4 и с 5 по 7.
    #39358012
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Rust_Cohle,

Отнюдь не очевидно. С учетом того, что явно перечислены группируемые поля.
...
Рейтинг: 0 / 0
Найти суммарные продажи за день, усредненные до продаж с 1 по 4 и с 5 по 7.
    #39358049
Фотография --Eugene--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Rust_Cohle,

от TC хрен дождешься
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
with v_sale as (
select date'2015-01-01'+numtodsinterval(30*7, 'day')+mod(level-1,28) DAY_ID, trunc((level-1)/28/3)+1 SHOP, mod(level-1,5)+1 ART_ID, (trunc((level-1)/28/3)+1)*100000 + mod(level-1,3)+1 TYPE, rownum/100 SALE_SUM from dual
connect by level <= 28*3*3*3
),
v_day as (
select date'2015-01-01'+numtodsinterval(30*7, 'day')+mod(level-1,28) DAY_ID, to_number(to_char(date'2015-01-01'+numtodsinterval(31*7, 'day')+mod(level-1,28), 'D')) WEEK_DAY_NUM, to_number(to_char(date'2015-01-01'+numtodsinterval(31*7, 'day')+mod(level-1,28), 'IW')) week_id from dual
connect by level <= 28*3*3*3
)
select d.week_id,
        s.shop,
        s.art_id,
        sum(s.sale_sum) sale_sum,
        sum(case when d.week_day_num between 1 and 4 then s.sale_sum end) sale_sum_1_4,
        sum(case when d.week_day_num between 5 and 7 then s.sale_sum end) sale_sum_5_7
    from v_day d
        join v_sale s
            on s.day_id = d.day_id
        where d.week_id in (32, 33)
    group by rollup (d.week_id,
        s.shop,
        s.art_id)
    order by 1, 2, 3

WEEK_IDSHOPART_IDSALE_SUMSALE_SUM_1_4SALE_SUM_5_732118.648.64321224.578.6415.93321316.4716.47321424.841.0823.76321524.316.28.132198.8225.9272.9322192.6131.3261.29322261.8361.83322392.8823.7669.12322469.6638.8830.7832255454322370.9893.96277.023231107.19107.193232160.9246.44114.483233115.0261.5653.46323499.3699.363235160.6554106.65323643.14162481.143241228.9669.12159.843242160.3884.2476.143243144.72144.723244228.6976.68152.013245152.55152.55324915.3230.04685.263251205.74106.9298.823252190.08190.083253296.7399.36197.373254197.91197.91325529791.8205.23251187.46298.08889.383261235.44235.443262364.77122.04242.733263243.27243.273264365.04114.48250.563265251.1129.6121.53261459.62366.121093.53271432.81144.72288.093272288.63288.633273433.08137.16295.923274296.46152.28144.183275280.8280.83271731.78434.161297.623281333.99333.993282501.12159.84341.283283341.82174.96166.863284326.16326.163285500.85167.4333.453282003.94502.21501.743291569.16182.52386.643292387.18197.64189.543293371.52371.523294568.89190.08378.813295379.35379.353292276.1570.241705.863210687.142682.728004.42331148.621.0627.54331246.7136.729.99331338.3425.9212.42331439.4219.7119.71331531.0510.820.25331204.12114.2189.913321137.43104.7632.673322129.0671.2857.783323130.1465.0765.073324121.7756.1665.61332516289.172.9332680.4386.37294.033331219.78116.64103.143332220.86110.43110.433333212.49101.52110.973334275.4157.14118.263335228.15172.855.353331156.68658.53498.153341311.58155.79155.793342303.21146.88156.333343388.8225.18163.623344318.87240.8478.033345310.5162148.53341632.96930.69702.273351393.93192.24201.693352502.2293.22208.983353409.59308.88100.713354401.22207.36193.863355402.3201.15201.153352109.241202.85906.393361615.6361.26254.343362500.31376.92123.393363491.94252.72239.223364493.02246.51246.513365484.65237.6247.053362585.521475.011110.513371591.03444.96146.073372582.66298.08284.583373583.74291.87291.873374575.37282.96292.413375729429.3299.73373061.81747.171314.633381673.38343.44329.943382674.46337.23337.233383666.09328.32337.773384842.4497.34345.063385681.75513168.753383538.082019.331518.753391765.18382.59382.593392756.81373.68383.133393955.8565.38390.423394772.47581.04191.433395764.1388.8375.33394014.362291.491722.873318983.1610825.658157.5129670.313508.3716161.93
...
Рейтинг: 0 / 0
Найти суммарные продажи за день, усредненные до продаж с 1 по 4 и с 5 по 7.
    #39358059
Фотография --Eugene--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ошибочка
Код: plsql
1.
2.
3.
4.
v_day as (
select date'2015-01-01'+numtodsinterval(30*7, 'day')+mod(level-1,28) DAY_ID, to_number(to_char(date'2015-01-01'+numtodsinterval(30*7, 'day')+mod(level-1,28)-1, 'D')) WEEK_DAY_NUM, to_number(to_char(date'2015-01-01'+numtodsinterval(30*7, 'day')+mod(level-1,28)-1, 'IW')) week_id from dual
connect by level <= 28*3*3*3
)

...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Найти суммарные продажи за день, усредненные до продаж с 1 по 4 и с 5 по 7.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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