oracle - 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,
我在哪里做错了。DESCRIPT1
DESCRIPT2
下面是在 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;
解决方案
要添加到 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
推荐阅读
- android - 解锁 HTML 文件
- javascript - Javascript - 使用预设选定选项创建下拉菜单
- angular - tslint:我想强制参数 typedef 但允许推断类型
- html - CSS将图像与混合混合模式差异隔离开来
- python - 摆脱 Python 字典中的 \n (换行符)
- git - 为什么不能提交和推送源树?
- haskell - 圆形素数
- c# - Elasticsearch Nest SDK 接受无效 JSON 的查询?
- python - 如何使用依赖于 AVI 文件的 python 打开 exe 文件?
- android - 在 log cat 中获取以下日志