K
K
Kirill Zhuravlev2017-10-15 07:46:22
Oracle
Kirill Zhuravlev, 2017-10-15 07:46:22

How to make such a selection in oracle sql?

Lord. There is such a base.
59e2e613e01ee864159623.jpeg
It is necessary to make a selection so that in the first column there are the first letters of the surnames of clients, in the second the average monthly payment of clients whose surname begins with this letter. The sample should be made from those clients whose water consumption (training base) is less than the average for all clients.
The whole difficulty is that you need to do this only with subqueries . GROUP BY cannot be used.
So far, I have done the simplest, this is a sample of customers whose consumption is less than the average for all.

select n_client from computation where (n_info_cold + n_info_hot) < (select avg(n_info_cold + n_info_hot) from computation) потребление воды меньше среднего

I'm trying to get a selection by the first letter of the last name:
select c_last_name from client where lower(c_last_name) in ('а%', 'б%', 'в%', 'г%', 'д%', 'е%', 'ё%', 'ж%', 'з%', 'и%', 'к%', 'л%', 'м%', 'н%', 'о%', 'п%', 'р%', 'с%', 'т%', 'у%', 'ф%', 'х%', 'ц%', 'ч%', 'ш%', 'щ%', 'э%', 'ю%', 'я%')

but the output is "no data found".
Of course it works like this:
select c_last_name from client where lower(c_last_name) like 'а%'

but this is for one letter.
I give a description of the semantics of the fields:
Таблица CLIENT – данные об абонентах.
•	N_CLIENT – лицевой счет
•	C_FIRST_NAME – имя
•	C_SECOND_NAME – отчество
•	C_LAST_NAME – фамилия
•	N_SEX – идентификатор пола
•	N_CITY – идентификатор города или поселка
•	N_STREET – идентификатор улицы
•	C_HOUSE – номер дома и номер корпуса
•	 N_FLAT – номер квартиры
•	N_PHONE – номер телефона

Таблица SEX – справочник пола
•	N_SEX – идентификатор пола
•	C_SEX – название пола

Таблица STREET – справочник улиц
•	N_STREET – идентификатор улицы
•	C_STREET – название улицы

Таблица CITY – справочник городов и поселков
•	N_CITY – идентификатор города или поселка
•	C_CITY – название города или поселка

Таблица PAYMENT – оплата абонента
•	N_CLIENT – лицевой счет абонента
•	D_PAY – дата оплаты
•	N_SUM – сумма оплаты
•	N_SIGN – признак(1 – оплата учтена при начислении, 0 – оплата не учтена)

Таблица COMPUTATION – начисления абонентов
•	N_COMPUTATION – идентификатор начисления
•	N_CLIENT – лицевой счет абонента
•	D_COMPUTATION – дата начисления
•	N_INFO_HOT – текущие показания счетчика горячей воды
•	N_INFO_COLD – текущие показания счетчика холодной воды
•	N_DIFFERENCE_HOT – разница текущих и предыдущих показаний счетчика горячей воды
•	N_DIFFERENCE_COLD – разница текущих и предыдущих показаний счетчика холодной воды
•	N_TARIFF – идентификатор тарифов на горячую и холодную воду
•	N_SUM_HOT – начисление за горячую воду за текущий период
•	N_SUM_HOT – начисление за холодную воду за текущий период
•	N_DEBT – долг на начало периода
•	N_PAY – оплата за предыдущий период
•	N_TOTAL – итоговая сумма на конец месяца

Таблица TARIFF – тарифы на горячую и холодную воду
•	N_TARIFF – идентификатор тарифов по холодной и горячей воде
•	D_TARIFF – дата смены тарифов на новые
•	N_TARIFF_HOT – тариф на горячую воду (в руб.)
•	N_TARIFF_COLD – тариф на холодную воду (в руб.)

Примечание: первая буква в названии поля обозначает тип данных этого поля
N – NUMBER, D – DATE, C – CHAR (VARCHAR2)

Answer the question

In order to leave comments, you need to log in

1 answer(s)
D
Denis Holub, 2017-10-15
@zhuravlevkk

See analytic functions.
Look at my request and experiment on your base.

select a.first_letter_fam, a.avg_plateg_by_letter
from (
select substr(n.c_last_name,1,1) as first_letter_fam, 
avg(подставить_сюда_полe_месячного платежа) 
    over (partition by substr(n.c_last_name,1,1)) as avg_plateg_by_letter,
(n_info_cold + n_info_hot) as potr_vody,
avg(n_info_cold + n_info_hot) over () as avg_potr_vody_all
from computation as c, client as n
where c.n_client = n.n_client) as a
where a.potr_vody < a.avg_potr_vody_all

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question