web-dev-qa-db-ja.com

ORACLEの複数の列の合計

97列のテーブルがあり、96列を合計したいと思います。

select sum(col1+col2+col3+.....+col96) 
from tableA where meter_id=x;

96列すべてに名前を付けたくないのですが、それを行うための最良の方法は何ですか?よろしく、RR

5
user2050018

各列名の書き込みを回避する方法はありません。あなたができることは、愚かなデータモデラーを呪い、カットアンドペーストで忙しくすることだけです。

6
APC

かなりの数の列がある場合は、データディクショナリテーブルを使用して、次のようなクエリを使用してクエリを作成することを検討します。

Select column_name || '+' as column_name_list
From user_tab_columns
Where table_name = 'TABLEA'
Order by column_id

それは世界を変えることはありませんが、1つのクエリを書くことを単純化します。

4
Mike Meyers

列を合計してから、その結果を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
);
1
Steve

次のように、96列を合計する 仮想列 を作成できます。

_alter table TABLEA add (MY_TOTAL_COL NUMBER GENERATED ALWAYS AS (col1+col2+col3...) VIRTUAL);
_

次に、クエリは単にsum(my_total_col)を実行できます。

1
GriffeyDog

以下の例のように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
;
0
Roger Cornejo
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'); 
0
Lynn Maya

それは可能かもしれません:

SQLプロシージャはテーブルを返すことができますか? とMike Meyersの答えを使用すると、動的SQLを使用してストアドプロシージャを記述できます。

 sumcolumns(columnfilter,tablename,whereclause)

のようなものを使用します

select * 
  from table(sumcolumns('column_name <> ''col97''','tableA','meter_id=x'))
0
Turo