- PR -

副問い合わせについて(COUNT)

1
投稿者投稿内容
TAKAMIKI
常連さん
会議室デビュー日: 2005/01/13
投稿数: 33
投稿日時: 2006-02-22 15:54
ORACLEのSQL文を作成していて詰まってしまったので質問させてください。
使用しているORACLEは、ORACLE10gです。

下記のように、出力したいと思っています。

<条件>
1.コード別に出力する。
2.(データA、データB、データC)を1つの列とみなし、コード別の件数を出力する。
3.コード別の金額を出力する。

<例示>
テーブルAがあります。

テーブルA
コード データA データB データC 金額A
012  1    2   3   100
012  1    2   3   200
012  1    2   4   150
013  1    2   3   100
013  1    2   4   200
013  1    2   5   150

結果
コード 件数 金額A
012 2  450
013 3  450

<SQL>
SELECT コード,count(distinct データA,データB,データC),sum(金額A)
FROM テーブルA
GROUP BY コード

上記のSQLを実行すると「引数の個数エラー」になってしまいます。
どのようにSQLを作成すればいいのでしょうか?

よろしくお願い致します。

※文字化けしてしまっていました。
 訂正が遅くなってしまい、申し訳ありませんでした。
 未記入(常連さん)ありがとうございました。


[ メッセージ編集済み 編集者: TAKAMIKI 編集日時 2006-02-28 22:28 ]
未記人
大ベテラン
会議室デビュー日: 2005/10/13
投稿数: 117
投稿日時: 2006-02-22 17:37
ORACLEのSQL文を作成していて詰まってしまったので質問させてください。
使用しているORACLEは、ORACLE10gです。

下記のように、出力したいと思っています。

<条件>
1.コード別に出力する。
2.(データA、データB、データC)を1つの列とみなし、コード別の件数を出力する。
3.コード別の金額を出力する。

<例示>
テーブルAがあります。

テーブルA
コード データA データB データC 金額A
012  1    2   3   100
012  1    2   3   200
012  1    2   4   150
013  1    2   3   100
013  1    2   4   200
013  1    2   5   150

結果
コード 件数 金額A
012 2  450
013 3  450

<SQL>
SELECT コード,count(distinct データA,データB,データC),sum(金額A)
FROM テーブルA
GROUP BY コード

上記のSQLを実行すると「引数の個数エラー」になってしまいます。
どのようにSQLを作成すればいいのでしょうか?

よろしくお願い致します。

温州蜜柑
ベテラン
会議室デビュー日: 2005/01/24
投稿数: 65
お住まい・勤務地: 東京都
投稿日時: 2006-02-22 18:50
全角だとサンプルを作りにくかったので、
下記のように変更してます。

テーブルA → sample
コード   → code
データA  → data_a
データB  → data_b
データC  → data_c
金額A   → money

こんな無理やりなSQLではイヤですか?

select
c.code, c.cnt, s.summary
from
(
select
distinct code, count(*) as cnt
from (
select distinct code, data_a, data_b, data_c from sample
)
group by code
) c inner join (
select distinct code, sum(money) over ( partition by code ) as summary from sample
) s on (
c.code = s.code
)

CODE CNT SUMMARY
---------- ---------- ----------
12 2 450
13 3 450
かずくん
会議室デビュー日: 2006/02/21
投稿数: 9
投稿日時: 2006-02-22 19:13
引用:

上記のSQLを実行すると「引数の個数エラー」になってしまいます。



この部分に限って言えば、ひとつにすればいいだけ・・・
データA,データB,データCが文字データなら

コード:
SELECT コード,count(distinct データA||データB||データC),sum(金額A) 

FROM テーブルA
GROUP BY コード


でいいでしょうし、数値データなら

コード:
SELECT コード,

count(distinct to_char(データA)||to_char(データB)||to_char(データC)),
sum(金額A)
FROM テーブルA
GROUP BY コード


とか、
仮に、データA,データB,データCが2桁までの数値とかであれば、

コード:
SELECT コード,

count(distinct データA*10000+データB*100+データC),
sum(金額A)
FROM テーブルA
GROUP BY コード


ということも出来ます。


ただし、データA,データB,データC にインデックスがあっても使われません。
結合したカラムを追加するとか、ファンクションインデックスを作るとかしか
ないですね。


[ メッセージ編集済み 編集者: かずくん 編集日時 2006-02-22 19:14 ]


[ メッセージ編集済み 編集者: かずくん 編集日時 2006-02-23 09:14 ]
とんくま
ベテラン
会議室デビュー日: 2005/08/02
投稿数: 56
お住まい・勤務地: 東京
投稿日時: 2006-02-23 00:30
コード:
SELECT code       AS コード
     , COUNT(*)   AS 件数
     , SUM(money) AS 金額A
  FROM (SELECT code
             , SUM(money) AS money
          FROM TAKAMIKI.TABLE_A
         GROUP BY
               GROUPING SETS ( (code, data_a, data_b, data_c) )
       ) Q
 GROUP BY
       code
;
 
コード 件数        金額A      
------ ----------- -----------
    12           2         450
    13           3         450


TAKAMIKI
常連さん
会議室デビュー日: 2005/01/13
投稿数: 33
投稿日時: 2006-02-28 22:31
返答が遅くなってしまい、申し訳ございません。
温州蜜柑さん、かずくんさん、とんくまさん返答ありがとうございます。

かずくんさんのおっしゃるとおり、DISTINCT句を『||』を使って列名を結合させるとうまくいきました。

ありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)