Обновлено несколько столбцов в таблице на основе значения count (*) из другой таблицы

0

Ниже мой избранный запрос

select orders.customerid,count(*) as count 
from Orderitem 
join orders on  OrderItem.orderno = orders.orderno 
group by customerid

Я хочу обновить столбцы 'Level' и 'Discount' в таблице 'custtable' на основе значения count (*) для customerid

  1. если count (*) <2, то Level = 1 и Discount = 10

  2. если count (*)> 3, то Level = 3 и Discount = 20

  3. если 0, то оба 0

Как это сделать в Mysql?

  • 0
    Какова связь custtable с двумя таблицами в вашем текущем запросе?
  • 0
    Customerid является общим как
Теги:

2 ответа

0

Вы можете сделать это с помощью коррелированного подзапроса в выражении UPDATE:

update custtable
    set (level, discount) = 
         (select (case when count(*) = 0 then 0
                       when count(*) <= 2 then 1
                       else 3
                  end) as level,
                 (case when count(*) = 0 then 0
                       when count(*) <= 2 then 10
                       else 20
                  end) as discount                  
          from Orderitem oi join
               orders o
               on oi.orderno = o.orderno 
          where o.customerid = custtable.customerId
         );

Обратите внимание, что Oracle позволяет обновлять несколько столбцов одновременно в одном update.

Я также немного изменил логику, поэтому количество "2" включено.

0

Поскольку вы не предоставили контрольный пример, я сделал это сам. Может быть и не идеально, но лучше, чем ничего.

SQL> create table custtable (customerid number, c_level number, discount number);

Table created.

SQL> insert into custtable
  2    select 1, null, null from dual union all
  3    select 2, null, null from dual;

2 rows created.

SQL>
SQL> create table orders (customerid number, orderno number);

Table created.

SQL> insert into orders
  2    select 1, 100 from dual union all
  3    select 3, 300 from dual;

2 rows created.

SQL>
SQL> create table orderitem (orderno number);

Table created.

SQL> insert into orderitem
  2    select 100 from dual union all
  3    select 300 from dual;

2 rows created.

Это ваш запрос:

SQL> select d.customerid, count(*) as count
  2    from orderitem i join orders d on d.orderno = i.orderno
  3    group by d.customerid;

CUSTOMERID      COUNT
---------- ----------
         1          1
         3          1

SQL>

Чтобы выполнить обновление, я бы предложил использовать инструкцию MERGE, такую как

SQL> merge into custtable t
  2    using (select d.customerid, count(*) as cnt
  3           from orderitem i join orders d on d.orderno = i.orderno
  4           group by d.customerid
  5          ) x
  6    on (t.customerid = x.customerid)
  7  when matched then update set
  8    t.c_level = case when x.cnt < 2 then 1
  9                     when x.cnt > 3 then 3
 10                     when x.cnt = 0 then 0
 11                end,
 12    t.discount = case when x.cnt < 2 then 10
 13                      when x.cnt > 3 then 20
 14                      when x.cnt = 0 then 0
 15                 end;

1 row merged.

Результат:

SQL> select * From custtable;

CUSTOMERID    C_LEVEL   DISCOUNT
---------- ---------- ----------
         1          1         10
         2

SQL>
  • 0
    Может ли кто-нибудь предоставить синтаксис в MySQL также

Ещё вопросы

Сообщество Overcoder
Наверх
Меню