Вывести название баллончика
with r as (select v.v_name,
v.v_id,
count(case when v_color = 'R' then 1 end) over(partition by v_id) cnt_r,
count(case when v_color = 'B' then 1 end) over(partition by b_q_id) cnt_b
from utV v join utB b on v.v_id = b.b_v_id)
select v_name
from r
where cnt_r > 1
and cnt_b > 0
group by v_name
Все задачи и решения:
https://exercises-on-sql.blogspot.com/2017/02/select-sql.html

Отобрать из таблицы Laptop те строки, для которых выполняется следующее условие:
значения
из столбцов speed, ram, price, screen возможно расположить таким
образом, что каждое последующее значение будет превосходить предыдущее в
2 раза или более.
Замечание: все известные характеристики ноутбуков больше нуля.
Вывод: code, speed, ram, price, screen.
select code, speed, ram, price, screen
from laptop where exists (
select 1 x
from (
select v, rank()over(order by v) rn
from ( select cast(speed as float) sp, cast(ram as float) rm,
cast(price as float) pr, cast(screen as float) sc
)l unpivot(v for c in (sp, rm, pr, sc))u
)l pivot(max(v) for rn in ([1],[2],[3],[4]))p
where [1]*2 <= [2] and [2]*2 <= [3] and [3]*2 <= [4]
)
Все задачи и решения:
https://exercises-on-sql.blogspot.com/2017/02/select-sql.html

Вывод: код модели, скорость процессора, объем памяти.
with CTE AS
(select
1 n, cast (0 as varchar(16)) bit_or,
code, speed, ram FROM PC
UNION ALL
select n*2,
cast (convert(bit,(speed|ram)&n) as varchar(1))+cast(bit_or as varchar(15))
, code, speed, ram
from CTE where n < 65536
)
select code, speed, ram from CTE
where n = 65536
and CHARINDEX('1111', bit_or )> 0
Все задачи и решения:
https://exercises-on-sql.blogspot.com/2017/02/select-sql.html

Рассматриваются только таблицы Income_o и Outcome_o. Известно, что прихода/расхода денег в воскресенье не бывает.
Для каждой даты прихода денег на каждом из пунктов определить дату инкассации по следующим правилам:
1. Дата инкассации совпадает с датой прихода, если в таблице Outcome_o нет записи о выдаче денег в эту дату на этом пункте.
2.
В противном случае - первая возможная дата после даты прихода денег,
которая не является воскресеньем и в Outcome_o не отмечена выдача денег
сдатчикам вторсырья в эту дату на этом пункте.
Вывод: пункт, дата прихода денег, дата инкассации.
select point,
"date" income_date,
"date" + nvl(
min(case when diff > cnt then cnt else null end),
max(cnt)+1
) incass_date
from (select i.point,
i."date",
(trunc(o."date") - trunc(i."date")) diff, -- разница дней
-- количество запрещенных для инкассации дней после прихода и до текущего запрещенного дня
count(1)
over (partition by i.point, i."date" order by o."date" rows between
unbounded preceding and current row)-1 cnt
from income_o i
join (select point, "date", 1 disabled from outcome_o
union
select point, trunc("date"+7,'DAY'), 1 disabled from income_o) o
on i.point = o.point
where o."date" > = i."date")
group by point, "date"
Все задачи и решения:
https://exercises-on-sql.blogspot.com/2017/02/select-sql.html

Написать запрос, который выводит все операции прихода и расхода из таблиц Income и Outcome в следующем виде:
дата, порядковый номер записи за эту дату, пункт прихода, сумма прихода, пункт расхода, сумма расхода.
При
этом все операции прихода по всем пунктам, совершённые в течение одного
дня, упорядочены по полю code, и так же все операции расхода
упорядочены по полю code.
В
случае, если операций прихода/расхода за один день было не равное
количество, выводить NULL в соответствующих колонках на месте
недостающих операций.
Select distinct A.date , A.R, B.point, B.inc, C.point, C.out
From (Select distinct date, ROW_Number() OVER(PARTITION BY date ORDER BY code asc) as R From Income
Union Select distinct date, ROW_Number() OVER(PARTITION BY date ORDER BY code asc) From Outcome) A
LEFT Join (Select date, point, inc
, ROW_Number() OVER(PARTITION BY date ORDER BY code asc) as RI FROM Income
) B on B.date=A.date and B.RI=A.R
LEFT Join (Select date, point, out
, ROW_Number() OVER(PARTITION BY date ORDER BY code asc) as RO FROM Outcome
) C on C.date=A.date and C.RO=A.R
Все задачи и решения:
https://exercises-on-sql.blogspot.com/2017/02/select-sql.html

Рассматриваются только таблицы Income_o и Outcome_o. Известно, что прихода/расхода денег в воскресенье не бывает.
Для каждой даты прихода денег на каждом из пунктов определить дату инкассации по следующим правилам:
1. Дата инкассации совпадает с датой прихода, если в таблице Outcome_o нет записи о выдаче денег в эту дату на этом пункте.
2.
В противном случае - первая возможная дата после даты прихода денег,
которая не является воскресеньем и в Outcome_o не отмечена выдача денег
сдатчикам вторсырья в эту дату на этом пункте.
Вывод: пункт, дата прихода денег, дата инкассации.
select point,
"date" income_date,
"date" + nvl(
min(case when diff > cnt then cnt else null end),
max(cnt)+1
) incass_date
from (select i.point,
i."date",
(trunc(o."date") - trunc(i."date")) diff, -- разница дней
-- количество запрещенных для инкассации дней после прихода и до текущего запрещенного дня
count(1)
over (partition by i.point, i."date" order by o."date" rows between
unbounded preceding and current row)-1 cnt
from income_o i
join (select point, "date", 1 disabled from outcome_o
union
select point, trunc("date"+7,'DAY'), 1 disabled from income_o) o
on i.point = o.point
where o."date" > = i."date")
group by point, "date"
Все задачи и решения:
https://exercises-on-sql.blogspot.com/2017/02/select-sql.html

Написать запрос, который выводит все операции прихода и расхода из таблиц Income и Outcome в следующем виде:
дата, порядковый номер записи за эту дату, пункт прихода, сумма прихода, пункт расхода, сумма расхода.
При
этом все операции прихода по всем пунктам, совершённые в течение одного
дня, упорядочены по полю code, и так же все операции расхода
упорядочены по полю code.
В
случае, если операций прихода/расхода за один день было не равное
количество, выводить NULL в соответствующих колонках на месте
недостающих операций.
Select distinct A.date , A.R, B.point, B.inc, C.point, C.out
From (Select distinct date, ROW_Number() OVER(PARTITION BY date ORDER BY code asc) as R From Income
Union Select distinct date, ROW_Number() OVER(PARTITION BY date ORDER BY code asc) From Outcome) A
LEFT Join (Select date, point, inc
, ROW_Number() OVER(PARTITION BY date ORDER BY code asc) as RI FROM Income
) B on B.date=A.date and B.RI=A.R
LEFT Join (Select date, point, out
, ROW_Number() OVER(PARTITION BY date ORDER BY code asc) as RO FROM Outcome
) C on C.date=A.date and C.RO=A.R
Все задачи и решения:
https://exercises-on-sql.blogspot.com/2017/02/select-sql.html
