SQL-запрос, как рассчитать значения использовать тот же столбец в одной таблице? - PullRequest
0 голосов
/ 06 ноября 2019

Я хотел бы вычислить тот же столбец с именем value в одной таблице с именем table_name:

CREATE TABLE IF NOT EXISTS Table_Name(
Code VARCHAR(20)          COMMENT 'Code',
Date                      COMMENT 'Date',
Value DECIMAL(25,2)         COMMENT 'Value',
Remark STRING                 COMMENT 'Value type, "111, 222, or 333 etc"',

Предполагается, что мне нужно вычислить "(тип значения = 111 или 222 или 333) / (тип значения = 444) "между 20180201 и 20180228, и я использую SQL-запрос, как показано ниже:

select t.code,t.date,t.remark,t1.value/t2.value as val
from table_name t
    right join (
        select sum(t.value) fzqsz, t.code from table_name t
        WHERE remark = '111' OR remark = '222' OR remark = '333'
        group by t.code,t.date
    ) t1 on t.code = t1.code
    left join (
        select sum(t.value) value,t.code from table_name t
        WHERE remark = '444'
        group by t.code,t.date
    ) t2 on t1.code = t2.code
    -- if I put below line in `SQL query` I get nothing(0 results)
    -- where t.code='00001' and t.date >='20180201' and date <= '20180228' 

Я выбираю только замечание =" 111 или 222 или 333 ", я не знаю, почему все замечания («555 и 666»), я получил результаты, как показано ниже:

    code         date              remark                  val
1   00001   2018-02-25 00:00:00.0    111                0.00002929
2   00001   2018-02-25 00:00:00.0    222                0.00002977
3   00002   2018-02-25 00:00:00.0    333                0.00002917
4   00003   2018-02-25 00:00:00.0    444                0.00002987
3   00001   2018-02-25 00:00:00.0    555                0.00002917
4   00002   2018-02-25 00:00:00.0    666                0.00002987

Правильно ли выполнен SQL-запрос? Я уверен, что есть некоторые проблемы с моим запросом SQL. Очень ценят за любые советы.

Ответы [ 3 ]

1 голос
/ 06 ноября 2019

используйте внутреннее соединение и mutiple or можно заменить на in

select t.code,t.date,t.remark,t1.value/t2.value as val
from table_name t
     join (
        select sum(t.value) fzqsz, t.code from table_name t
        WHERE remark in( '111','222' ,'333')
        group by t.code,t.date
    ) t1 on t.code = t1.code
     join (
        select sum(t.value) value,t.code from table_name t
        WHERE remark = '444'
        group by t.code,t.date
    ) t2 on t1.code = t2.code 
    where t.code='00001' and t.date >='20180201' and date <= '20180228'

, что вы можете сделать ниже, используя случай, когда

 select (sum(case when remark in( 111,222 ,333) then t.value else 0 end)/
 sum(case when remark=444 then t.value else 0 end)) as val,
 t.code,t.date from table_name t
 where t.code='00001' and t.date >='20180201' and date <= '20180228'
  group by t.code,t.date
0 голосов
/ 06 ноября 2019

ПРОЧИТАЙТЕ комментарии!

Эльза, мало смысла в том, что ты реагируешь только на ответы. Эти два плаката просто предполагают , чего вы, возможно, захотите достичь. По вашей просьбе есть вопросы, на которые вы до сих пор не отреагировали. Вы действительно используете Oracle? Каков ключ таблицы (то есть, что уникально идентифицирует одну строку)? Почему вы группируете по дате внутри подзапросов? Каких строк результатов вы ожидаете?

Поскольку вы, похоже, не читаете комментарии, я разместил это как ответ.

0 голосов
/ 06 ноября 2019

вы можете использовать регистр выбора, а не присоединяться к тем же таблицам.

select t2.code, t2.date, t2.remark, t3.val/t3.val2 from 
table_name t2
inner join (
    select t.code, sum(case when t.remark in ('111', '222', '333') then 1 else 0 end) as val
        , sum(case when t.remark in ('444') then 1 else 0 end) as val2
    from table_name t
    where t.code = '00001' and t.date between '20180201' and '20180228'
    group by t.code) t3 on t3.code = t2.code
where t2.remark in ('111', '222', '333', '444')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...