2

すべてのリスト値を、つまりカウンターで表示したいという奇妙なケースがあります。テストテーブルの内容

name, misc
A, blah
B, 123
A, asd

現在、このクエリはAとBの結果のみをフェッチしますが、Cの「結果」を表示するにはどうすればよいですか。

select name, count(*) from table 
where name in ('A','B','C')

取得したい結果

A 2
B 1
C 0

この事件は私をもう一日狂わせている。助けてください

乾杯、ダン

4

3 に答える 3

1

このタイプのクエリには、次のような外部結合を使用する必要があると思います。

WITH mylist AS (SELECT 'A' name FROM DUAL
                UNION ALL SELECT 'B' FROM DUAL
                UNION ALL SELECT 'C' FROM DUAL)
SELECT l.name, COUNT(t.name)
  FROM mylist l
  LEFT JOIN mytable t ON l.name = t.name
 GROUP BY l.name

UNIONALLの代わりにテーブルオブジェクトを使用できます。

CREATE TYPE name_list_t AS TABLE OF VARCHAR2(30);
/

SELECT l.name, COUNT(t.name)
  FROM (SELECT column_value name FROM TABLE(name_list_t('A', 'B', 'C')) l
  LEFT JOIN mytable t ON l.name = t.name
 GROUP BY l.name
于 2012-07-12T09:24:42.913 に答える
0

ここからスプリッター関数を取得します:Oracleでcsvをテーブルに変換する方法

その後

select a.column_value, count(t.name) 
from table(splitter('A,B,C')) a
left join table t on (t.name = a.column_value)
group by a.column_value
于 2012-07-12T09:32:03.353 に答える
0

これは、値のリストを含むテーブルを外部結合することで実現できます。

WITH lookup AS (
SELECT decode(LEVEL
             ,1,'A'
             ,2,'B'
             ,3,'C') col1
  FROM dual
CONNECT BY LEVEL <= 3
)
,test AS (
SELECT decode(LEVEL
             ,1,'A'
             ,2,'A'
             ,3,'B') col1
     ,decode(LEVEL
             ,1,'blah'
             ,2,'123'
             ,3,'asd') col2        
  FROM dual
CONNECT BY LEVEL <= 3
) 
SELECT lookup.col1,count(test.col1)
  FROM lookup
      ,test
 WHERE lookup.col1 = test.col1 (+)
GROUP BY lookup.col1
;

戻り値:

A   2
B   1
C   0

私の例では、「ルックアップ」はその場で生成されます。このアプローチを使用するか、独自の値リストテーブルを使用する方がよいでしょう。

于 2012-07-12T09:27:12.453 に答える