试图在几个相关的列中找到不同数量的项目
Posted
技术标签:
【中文标题】试图在几个相关的列中找到不同数量的项目【英文标题】:Trying to find distinct number of items in several co-related columns 【发布时间】:2022-01-14 02:00:55 【问题描述】:我有一个包含 3 列的表,即业务功能、主机和 IT 服务。一个业务功能拥有多个主机,每个主机都有多个与之关联的服务。
表格示例如下-
Business Function | Host Name | It Services |
---|---|---|
Commercial Banking | GigaTux | AAA |
Commercial Banking | GigaTux | CCC |
Wealth | HTX | RRR |
Wealth | HTX | DDD |
Commercial Banking | KDP | AAA |
Wealth | Fusion | FFF |
Commercial Banking | CreateX | QQQ |
Wealth | Icon | ZZZ |
我需要找出业务功能中不同主机的数量,以及在该业务功能的不同主机中映射到超过 1 个 IT 服务的共享主机的数量。
想要的表如下(表名是es_dashboard)-
Business Function | Host | Shared Hosts |
---|---|---|
Commercial Banking | 3 | 1 |
Wealth | 3 | 1 |
这是因为商业银行有 3 个不同的主机 - GigaTux、KDP 和 CreateX,并且只有 1 个主机 (GigaTux) 映射了超过 1 个 IT 服务。同样的道理也适用于财富。
我目前的SQL代码如下-
SELECT ES.business_function AS 'Business Function' , COUNT(DISTINCT host) AS 'Host ',
(SELECT count(*)
FROM es_dashboard ESO
WHERE ES.business_function = ESO.business_function
AND ESO.host IN
(SELECT EST.host
FROM es_dashboard EST
WHERE ES.business_function = EST.business_function AND EST.host = ESO.host AND count(distinct EST.it_service) > 2)
) AS "Shared Hosts"
FROM es_dashboard ES
GROUP BY BF;
目标是使用嵌套查询而不创建任何新表。
我可以在业务功能中获取不同的主机,但在找出不同的 IT 服务时遇到了麻烦。有人可以帮忙吗?
【问题讨论】:
您真正使用哪个数据库系统? 我删除了冲突的 DBMS 标签。请为您真正使用的数据库产品添加一个标签。 @NicoHaase 我正在使用 MariaDB 【参考方案1】:您可以使用多个sub-queries
来实现:
查询:
SELECT
hst.Business_Function,
hst.HOST,
COALESCE (shr.SHARED_HOST,0) AS SHARED_HOST
FROM
(
SELECT
Business_Function,
COUNT(distinct Host_Name) as HOST
FROM es_dashboard
GROUP BY Business_Function
) AS hst
LEFT JOIN
(
SELECT Business_Function,
COUNT(DISTINCT HOST_Name) AS SHARED_HOST
FROM
(
SELECT Business_Function, Host_Name,
COUNT(distinct It_services) AS it_cnt
FROM es_dashboard AS esd
GROUP BY Business_Function, Host_Name
) AS it
WHERE it_cnt>1
GROUP BY Business_Function
) AS shr
ON hst.Business_function = shr.business_function
查询说明:
FROM
子句中的子查询将为我们提供每个业务功能中的 HOSTS 计数
JOIN
子句中的一个将为我们提供超过 1 个it_services
的 HOSTS 计数
然后我们LEFT JOIN
,因为业务功能中的主机NONE
可能有>1 it_services
使用COALESCE
处理此类情况(根据您的要求修改)
见演示here
【讨论】:
以上是关于试图在几个相关的列中找到不同数量的项目的主要内容,如果未能解决你的问题,请参考以下文章