首页 > 解决方案 > oracle 多列中存在的 COUNT 个不同值

问题描述

我有下表,我想计算两列之间交叉的不同值。

ID_DATE     DESCRIPT1   DESCRIPT2
20191001    A           R
20191001    D           B
20191001    B           D
20191001    A           B
20191002    A           B
20191002    C           A
20191002    A           B

以下是我的查询,但结果不准确

SELECT  
COUNT(distinct DESCRIPT1 || ' - ' ||  DESCRIPT2) AS ALL_DESCRIPT,
COUNT(DISTINCT DESCRIPT1) AS DESCRIPT_A, 
COUNT(DISTINCT DESCRIPT2) AS DESCRIPT_B, 
ID_DATE FROM MY_TABLE  GROUP BY ID_DATE;

我的结果,

在此处输入图像描述

ALL_DESCRIPT    DESCRIPT_A  DESCRIPT_B  ID_DATE
4               3           3           20191001
2               2           2           20191002

在我的结果中,ID_DATE 20191002 的列给了我总共 2 而不是 3。它应该是 3,因为我有 A、B 和 C,这两个列中 ALL_DESCRIPT 总共是 3, 我在哪里做错了。DESCRIPT1DESCRIPT2

下面是在 oracle 中测试的插入查询,以防万一需要。

   INSERT all 
   INTO SRC_DATA (ID_DATE, DESCRIPT1, DESCRIPT2) VALUES ('20191001','A','R')
   INTO SRC_DATA (ID_DATE, DESCRIPT1, DESCRIPT2) VALUES ('20191001','D','B')
   INTO SRC_DATA (ID_DATE, DESCRIPT1, DESCRIPT2) VALUES ('20191001','B','D')
   INTO SRC_DATA (ID_DATE, DESCRIPT1, DESCRIPT2) VALUES ('20191001','A','B')
   INTO SRC_DATA (ID_DATE, DESCRIPT1, DESCRIPT2) VALUES ('20191002','A','B')
   INTO SRC_DATA (ID_DATE, DESCRIPT1, DESCRIPT2) VALUES ('20191002','C','A')
   INTO SRC_DATA (ID_DATE, DESCRIPT1, DESCRIPT2) VALUES ('20191002','A','B')
   SELECT * FROM dual;

标签: oraclecountdistinct

解决方案


要添加到 littlefoot 的查询并给出其他列,这是一个枢轴操作,看起来:

select 
  id_date, 
  count(distinct descript) all_descript,
  count(case when descript = 'A' then 1 end) as descript_a,
  count(case when descript = 'B' then 1 end) as descript_B
from 
(
  select id_date, descript1 descript
  from src_data
  union all
  select id_date, descript2 descript 
  from src_data
) x
group by id_date
order by id_date;

您可以按照将另一个字母放在字符串中并以不同方式命名列的模式为不同的字母添加更多列。它的工作原理是当数据为 A 时返回非空值,当数据不是 A 时返回空值。计数仅计算非空数据。使用它可能更有意义SUM(CASE WHEN descript = 'A' THEN 1 ELSE 0 END)- 效果相同


编辑:实际上我认为我误解了这个请求。试试这个:

    select 
      id_date, 
      count(distinct descript) all_descript,
      count(distinct descript1) as descript_a,
      count(distinct descript2) as descript_B
    from 
    (
      select id_date, descript1 descript, descript1, descript2
      from src_data
      union all
      select id_date, descript2 descript, null, null
      from src_data
    ) x
    group by id_date
    order by id_date

推荐阅读