97列のテーブルがあり、96列を合計したいと思います。
select sum(col1+col2+col3+.....+col96)
from tableA where meter_id=x;
96列すべてに名前を付けたくないのですが、それを行うための最良の方法は何ですか?よろしく、RR
各列名の書き込みを回避する方法はありません。あなたができることは、愚かなデータモデラーを呪い、カットアンドペーストで忙しくすることだけです。
かなりの数の列がある場合は、データディクショナリテーブルを使用して、次のようなクエリを使用してクエリを作成することを検討します。
Select column_name || '+' as column_name_list
From user_tab_columns
Where table_name = 'TABLEA'
Order by column_id
それは世界を変えることはありませんが、1つのクエリを書くことを単純化します。
列を合計してから、その結果をExcelに入れて、合計を計算することをお勧めします。それ以外の場合、このクエリは必要なことを実行する必要があります。
SELECT SUM(TOTAL_SUM) FROM (
SELECT SUM(column1) AS TOTAL_SUM FROM your_table
UNION
SELECT SUM(column2) AS TOTAL_SUM FROM your_table
UNION
SELECT SUM(column3) AS TOTAL_SUM FROM your_table
);
次のように、96列を合計する 仮想列 を作成できます。
_alter table TABLEA add (MY_TOTAL_COL NUMBER GENERATED ALWAYS AS (col1+col2+col3...) VIRTUAL);
_
次に、クエリは単にsum(my_total_col)
を実行できます。
以下の例のようにUNPIVOTを使用してみてください(他の人が指摘しているように、列リストを指定する必要があります)。
with tableA as /* prototype tableA just for example */
(
select 1 meter_id, 101 col1, 10 col2, 20 col3, 30 col4, NULL col5, 101 col11, 10 col12, 20 col13, 30 col14, NULL col15, 101 col21, 10 col22, 20 col23, 30 col24, NULL col25 from dual union
select 2, 102, 40, NULL, 50, NULL, 102, 40, NULL, 50, NULL, 102, 40, NULL, 50, NULL from dual union
select 3, 103, 60, 70, 80, 90, 103, 60, 70, 80, 90, 103, 60, 70, 80, 90 from dual union
select 4, 104, 100, NULL, NULL, NULL, 104, 100, NULL, NULL, NULL, 104, 100, NULL, NULL, NULL from dual
)
, unpivoted_tableA as /* UNPIVOT tableA columns into rows */
(
select *
from tableA
unpivot include nulls
(
col_value for col_ in
(COL1,COL2,COL3,COL4,COL5,COL11,COL12,COL13,COL14,COL15,COL21,COL22,COL23,COL24,COL25)
)
)
/* main query - Sum of all columns that were unpivoted to rows */
select meter_id, sum(col_value)
from unpivoted_tableA
group by meter_id
;
SELECT A.consol_key,
A.amt_lcy,
B.amt_lcy,
C.amt_lcy
FROM categ A,
spec B,
stmt C;
SELECT Sum(total_sum)
FROM (SELECT Sum(amt_lcy) AS TOTAL_SUM
FROM categ
UNION
SELECT Sum(amt_lcy) AS TOTAL_SUM
FROM spec
UNION
SELECT Sum(amt_lcy) AS TOTAL_SUM
FROM stmt)
WHERE table_id NOT IN (SELECT table_id
FROM categ
WHERE txn_code = 'COR'
AND system_id <> 'AA');
それは可能かもしれません:
SQLプロシージャはテーブルを返すことができますか? とMike Meyersの答えを使用すると、動的SQLを使用してストアドプロシージャを記述できます。
sumcolumns(columnfilter,tablename,whereclause)
のようなものを使用します
select *
from table(sumcolumns('column_name <> ''col97''','tableA','meter_id=x'))