试图在几个相关的列中找到不同数量的项目

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

【讨论】:

以上是关于试图在几个相关的列中找到不同数量的项目的主要内容,如果未能解决你的问题,请参考以下文章

在每一行中从多个不同的列中查找唯一值

如何在特定数量的列中找到 tensorflow 数据集批次中的最大值?

从数据框中删除“重复”行(它们在几列中有所不同)[重复]

查询以返回单行,其中多个项目位于行内的不同列中

Sqlite 从不同的列中减去不同的行

如何在不同的列中显示包含每个月值的汇总数据?