powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / SQL Запрос без case when, а с помощью формулы
17 сообщений из 17, страница 1 из 1
SQL Запрос без case when, а с помощью формулы
    #39588431
Yagut
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте. Я пока начинающий в SQL, пожалуйста не ругать. Дано задание :

Код: plsql
1.
2.
3.
product | action |   date   | amount
book    |   1    | 1/5/2017 |  100
book    |  -1    | 3/6/2017 |   30


1- ввод товара, amount - количество, -1 - вывод товара

Вопрос следующий: Вывести таблицу в виде
product | income | outcome | sum
до определенной даты.

где sum - это количество оставшегося товара. Использовать case when не хочу.
...
Рейтинг: 0 / 0
SQL Запрос без case when, а с помощью формулы
    #39588439
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Yagut,

декоде?
...
Рейтинг: 0 / 0
SQL Запрос без case when, а с помощью формулы
    #39588451
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YagutИспользовать case when не хочу.Извращенец.
Код: plsql
1.
nullif(greatest/*least*/(action*amount, 0), 0)

...
Рейтинг: 0 / 0
SQL Запрос без case when, а с помощью формулы
    #39588452
Dshedoo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
with q as (
select 'book' as product, 1 as action, sysdate-1 as "DATE", 100 as amount from dual
union all
select 'book', -1, sysdate, 30 from dual
union all
select 'book', -1, sysdate, 10 from dual)

, income as (select product, sum(amount) as income from q where q.action = 1 group by product)
, outcome as (select product, sum(amount) as outcome from q where q.action = -1 group by product)

select distinct q.product, income.income, outcome.outcome, income.income-outcome.outcome from q join income on q.product = income.product
join outcome on q.product = outcome.product



Без case, но это убого.

С case:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
with q as (
select 'book' as product, 1 as action, sysdate-1 as "DATE", 100 as amount from dual
union all
select 'book', -1, sysdate, 30 from dual
union all
select 'book', -1, sysdate, 10 from dual)

select product
     , sum(case when action = -1 then 0 else amount end) as income
     , sum(case when action = 1 then 0 else amount end) as outcome
     , sum(amount*action) as summa
     from q
group by product     
...
Рейтинг: 0 / 0
SQL Запрос без case when, а с помощью формулы
    #39588453
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Elic,

а если в амаунте сторно отрицательное?
...
Рейтинг: 0 / 0
SQL Запрос без case when, а с помощью формулы
    #39588461
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreymxа если в амаунте сторно отрицательное?Вынеси amount за скобки.
...
Рейтинг: 0 / 0
SQL Запрос без case when, а с помощью формулы
    #39588537
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Elic
Код: plsql
1.
nullif(greatest/*least*/(action*amount, 0), 0)




А суслик то есть (NULLIF это зaконспирированный CASE):

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
SQL> select * from dual where nullif(dummy,'Y') = 'X';

D
-
X


Execution Plan
----------------------------------------------------------
Plan hash value: 272002086

--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |     1 |     2 |     2   (0)| 00:00:01 |
|*  1 |  TABLE ACCESS FULL| DUAL |     1 |     2 |     2   (0)| 00:00:01 |
--------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter(CASE "DUMMY" WHEN 'Y' THEN NULL ELSE "DUMMY" END ='X')



SY.
...
Рейтинг: 0 / 0
SQL Запрос без case when, а с помощью формулы
    #39588565
Yagut
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Elic, сказали использовать формулы. И поменьше готовых функций. Задание такого. Видимо для того, чтоб я лучше поняла работу всего этого
...
Рейтинг: 0 / 0
SQL Запрос без case when, а с помощью формулы
    #39588567
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Yagut,

Как правильно заметил Elic, то еще извращение

Код: plsql
1.
2.
3.
4.
5.
6.
select product,
sum(sign(action+1)*amount) income,
sum(sign(action-1)*amount) outcome,
sum(action*amount) sum_
from q
group by product
...
Рейтинг: 0 / 0
SQL Запрос без case when, а с помощью формулы
    #39588570
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SYElic
Код: plsql
1.
nullif(greatest/*least*/(action*amount, 0), 0)





А суслик то есть (NULLIF это зaконспирированный CASE):
SY.тогда юнион олл + групп бай сверху
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
select product,
       amount as income,
       null as outcome,
       -amount as summa
  from q
 where action = -1
union all
select product,
       null as income,
       amount as outcome,
       amount as summa
  from q
 where action = 1
    
...
Рейтинг: 0 / 0
SQL Запрос без case when, а с помощью формулы
    #39588573
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YagutЗадание такогоЗадания нужно делать самому, а не побираться по форумам.
...
Рейтинг: 0 / 0
SQL Запрос без case when, а с помощью формулы
    #39588575
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YagutElic, сказали использовать формулы. И поменьше готовых функций. Задание такого. Видимо для того, чтоб я лучше поняла работу всего этого

Если проверяют знание математики и если проверяют приучина ли к лотку

Код: plsql
1.
2.
3.
4.
5.
6.
select product,
sum((action+1)*amount/2) income,
sum((action-1)*amount/2) outcome,
sum(action*amount) sum_
from q
group by product
...
Рейтинг: 0 / 0
SQL Запрос без case when, а с помощью формулы
    #39588660
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Без формул
Джойн с подзапросом с двумя строками из дюала
...
Рейтинг: 0 / 0
SQL Запрос без case when, а с помощью формулы
    #39588845
Yagut
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MaximaXXL,
Ведь SQL НЕ поймет который из action-ов записать в формулу, 1 или -1..
Как быть тогда?
...
Рейтинг: 0 / 0
SQL Запрос без case when, а с помощью формулы
    #39588849
Yagut
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Elic,
Я начинающая. Не стоит грубить. Постепенно научусь. Хотела бы спросить о книгах, которые помогут вступить в весь этот мир
...
Рейтинг: 0 / 0
SQL Запрос без case when, а с помощью формулы
    #39589213
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YagutMaximaXXL,
Ведь SQL НЕ поймет который из action-ов записать в формулу, 1 или -1..
Как быть тогда?

Я не очень понял вопрос, что значит который из action-ов?
Он запишет оба, но при action = 1 комбинация action-1 даст 0 и outcome получиться
сумма(
(1-1)*amount/2 /* строки где action = 1 равны 0*amount/2 и равны 0*/
(-1-1)*amount/2 /* строки где action = -1 равны -2*amount/2 и равна -amount*/
)
общая сумма даст сумму строк amount где action = -1 со знаком минус, если знак нужен + то делить лучше на (-2) компенсируя знак или воспользоваться abs() - модуль. Но вы хотели побольше математики - берите тогда (-2) если надо компенсировать знак.
...
Рейтинг: 0 / 0
SQL Запрос без case when, а с помощью формулы
    #39589277
alex-ls
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YagutElic,
Я начинающая. Не стоит грубить. Постепенно научусь.
научитесь конечно, жаль не тому, как нужно работать
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / SQL Запрос без case when, а с помощью формулы
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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