Объединение оператора CASE WHEN и столбца, содержащего строки типа «Столбец 1 || '_' || Столбец 2» в Oracle SQL - PullRequest
0 голосов
/ 13 января 2020

У меня есть таблица, состоящая из трех столбцов, которые называются следующим образом:

1) Месяц 2) Store_Type 3) Город

Мне нужно расширить эту таблицу, чтобы она содержала пять столбцов и два столбца, которые я добавлю sh, подробно описаны ниже.

Во-первых, в запросе необходимо создать новый столбец с именем Store_Code. Задача столбцов Store_Code - хранить числовое значение, соответствующее типу хранилища.

Я предполагаю, что это будет сделано с помощью оператора CASE WHEN типа:

SELECT Month,Store_Type,City,
CASE
WHEN Store_Type = 'Corner Shop' THEN '1'
WHEN Store_Type = 'Megastore' THEN '2'
WHEN Store_Type = 'Petrol Station' THEN '3'
....
ELSE '10'
END Store_Code
FROM My_Table

После того, как это будет завершено, мне нужно создать столбец, известный как "Store_Key". Значения, содержащиеся в столбце Store_Key, должны иметь следующую форму:

«Месяц для этой строки» «Тип магазина для этой строки» «Город, связанный с этой строкой» _ «Код магазина для этой строки»

Я думаю, что лучший способ создать этот столбец - использовать запрос, подобный следующему:

SELECT (My_Table.Month || '_' || My_Table.Store_Type || '_' || My_Table.City || '_' || 
My_Table.Store_Code)
FROM My_Table

Что мне нужно для этих два отдельных запроса для объединения в один запрос. Я полагаю, что это можно сделать путем подстановки различных запросов SELECT, но я открыт и благодарен за любые альтернативные решения.

Спасибо, что нашли время, чтобы прочитать эту проблему, и все решения очень ценятся.

Ответы [ 3 ]

0 голосов
/ 13 января 2020

Если вы пытаетесь заполнить свои новые столбцы, тогда вам нужен оператор обновления. Я бы использовал два обновления, чтобы убедиться, что вы указали store_case для вашего store_code. В противном случае, если вы выводите его в режиме реального времени, ответом на выбор подзапроса будет путь к go.

update my_table
set store_case = 
  case store_type 
    when 'Corner Shop' then 1 
    when 'Megastore' THEN 2
    when 'Petrol Station' THEN 3
    ...
    else 10
  end case;

  commit;

update my_table
set store_code = Month || '_' || to_char(Store_Type) || '_' || City || '_' || Store_Code;
commit;
0 голосов
/ 13 января 2020

Зачем использовать подзапрос? Это можно сделать в рамках одного запроса следующим образом:

SELECT My_Table.Month || '_' || My_Table.Store_Type || '_' || My_Table.City || '_' || 
      CASE
          WHEN Store_Type = 'Corner Shop' THEN '1'
          WHEN Store_Type = 'Megastore' THEN '2'
          WHEN Store_Type = 'Petrol Station' THEN '3'
          ....
          ELSE '10'
      END as result
FROM My_Table

или использовать функцию DECODE следующим образом:

SELECT My_Table.Month || '_' || My_Table.Store_Type || '_' || My_Table.City || '_' || 
       DECODE(Store_Type,
             'Corner Shop', '1', 
             'Megastore', '2', 
             'Petrol Station', '3' 
              ...., 
             '10') -- this is default value same as else part of the case statement
              as result
FROM My_Table

Cheers !!

0 голосов
/ 13 января 2020

Выполните выражение case внутри производной таблицы (подзапрос):

SELECT (My_Table2.Month || '_' || My_Table2.Store_Type || '_' || My_Table2.City || '_' || 
My_Table2.Store_Code)
FROM
(
    SELECT Month,Store_Type,City,
    CASE
    WHEN Store_Type = 'Corner Shop' THEN '1'
    WHEN Store_Type = 'Megastore' THEN '2'
    WHEN Store_Type = 'Petrol Station' THEN '3'
    ....
    ELSE '10'
    END Store_Code
    FROM My_Table
) My_Table2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...