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

您可以使用表对象而不是 UNION ALL:

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 回答