У меня в таблице несколько числовых столбцов с разными NUMBER(p,s)
типами. Таблица была создана с CREATE TABLE xx as (select date, SUM(x), SUM(y) from xxx GROUP BY date)
. Похоже, что снежинка определила минимум NUMBER(precision, scale)
, необходимый для хранения каждого результирующего столбца. Это приводит к различным типам для каждого столбца.
Теперь я хочу ОТКЛЮЧИТЬ эти столбцы, и Снежинка будет жаловаться, что SQL compilation error: The type of column 'xxxxx' conflicts with the type of other columns in the UNPIVOT list
Я создаю эту небольшую минимальную таблицу, чтобы проиллюстрировать проблему:
create or replace temporary table temp1(id number, sales number(10,0), n_orders number(20,0)) as (
select * from (values
(1, 1, 2 )
,(2, 3, 4)
,(3, 5, 6)
)
); -- imagine that temp1 was created via a select AGG1, AGG2 FROM XXX GROUP BY YYY
describe table temp1;
--
name type kind null? default primary key unique key check expression comment
ID NUMBER(38,0) COLUMN Y N N
SALES NUMBER(10,0) COLUMN Y N N
N_ORDERS NUMBER(20,0) COLUMN Y N N
select *
from temp1 UNPIVOT(measure_value for measure_name in (sales, n_orders)); -- won't work because SALES is NUMBER(10,0) and N_ORDERS is NUMBER(20,0)
Прямо сейчас мойОбходной путь заключается в приведении каждого столбца к явному TO_NUMBER(x, 38,0) as x
, например, так:
with t1 as (
select
id
,TO_NUMBER(sales,38,0) as sales
,TO_NUMBER(n_orders, 38,0) as n_orders
from temp1
)
select * from t1 UNPIVOT(measure_value for measure_name in (sales, n_orders));
Это менее чем оптимально, поскольку в реальной таблице, которую я использую, много столбцов.
Я не хочу воссоздавать таблицу (агрегирование занимает много времени), так какие у меня варианты?
Есть ли другой синтаксис, который я могу использовать для массового приведения списка столбцов?