【问题标题】:SQL - find count based on 2 fieldsSQL - 根据 2 个字段查找计数
【发布时间】:2019-12-23 22:57:58
【问题描述】:

我有一个场景,我有 1 张桌子。 该表的数据如下:

CATEGORY_TYPE       CATEGORY_TYPE_DESC  RETL_ID
SUPPLIER_XREF       SUPPLIER_XREF       21731
SUPPLIER_SITE_XREF  SUPPLIER_SITE_XREF  21731

我想查找 RETL_ID 出现两次但一条记录属于 SUPPLIER_XREF 而另一条记录属于 SUPPLIER_SITE_XREF 的计数。

我试过了,但这不会返回任何记录。

select RETL_ID, COUNT(*)
FROM RFI_XREF_DVM
WHERE 
CATEGORY_TYPE IN ('SUPPLIER_SITE_XREF') 
AND CATEGORY_TYPE IN ('SUPPLIER_XREF') 
GROUP BY RETL_ID
HAVING COUNT (*) = 2;

【问题讨论】:

    标签: sql oracle count duplicates


    【解决方案1】:

    计算 CATEGORY_TYPE 的不同出现次数:

    SELECT RETL_ID, COUNT(DISTINCT CATEGORY_TYPE)
    FROM RFI_XREF_DVM
    WHERE CATEGORY_TYPE IN ('SUPPLIER_XREF', 'SUPPLIER_SITE_XREF') 
    GROUP BY RETL_ID
    HAVING COUNT(DISTINCT CATEGORY_TYPE) = 2;
    

    如果您希望 CATEGORY_TYPE 只有这 2 个值而没有其他值:

    SELECT RETL_ID, COUNT(DISTINCT CATEGORY_TYPE)
    FROM RFI_XREF_DVM
    GROUP BY RETL_ID
    HAVING 
      COUNT(DISTINCT CATEGORY_TYPE) = 2
      AND
      SUM(CASE WHEN CATEGORY_TYPE NOT IN ('SUPPLIER_XREF', 'SUPPLIER_SITE_XREF') THEN 1 ELSE 0 END) = 0
    

    【讨论】:

      【解决方案2】:
      select a.RETL_ID, COUNT(*)
      FROM RFI_XREF_DVM a, RFI_XREF_DVM b
      WHERE 
      A.CATEGORY_TYPE IN ('SUPPLIER_SITE_XREF') 
      AND b.CATEGORY_TYPE IN ('SUPPLIER_XREF') and a. RETL_ID = b.RETL_ID
      GROUP BY a.RETL_ID
      HAVING COUNT (*) = 1;
      

      【讨论】:

        【解决方案3】:

        您可以使用GROUP BYHAVING 实现此目的:

        SELECT RETL_ID, 
        COUNT(1) -- represent 2 for 21731 as per your sample data. If you want it 1 then use distinct retl_id instead of 1 in count
        FROM RFI_XREF_DVM
        GROUP BY 
        RETL_ID
        HAVING
        SUM(CASE WHEN CATEGORY_TYPE = 'SUPPLIER_XREF' 
        THEN 1 END) = 1 AND
        SUM(CASE WHEN CATEGORY_TYPE = 'SUPPLIER_SITE_XREF' 
        THEN 1 END) = 1
        

        干杯!!

        【讨论】:

          【解决方案4】:

          如果你想要计数,那么一种方法是使用两个级别的聚合:

          SELECT COUNT(*)
          FROM (SELECT RETL_ID
                FROM RFI_XREF_DVM
                GROUP BY RETL_ID
                HAVING LISTAGG(CATEGORY_TYPE, ',') WITHIN GROUP (ORDER BY CATEGORY_TYPE) = 'SUPPLIER_SITE_XREF,SUPPLIER_XREF'
               ) r;
          

          或者:

          SELECT COUNT(*)
          FROM (SELECT RETL_ID
                FROM RFI_XREF_DVM
                GROUP BY RETL_ID
                HAVING SUM(CASE WHEN CATEGORY_TYPE = 'SUPPLIER_SITE_XREF' THEN 1 ELSE 0 END) = 1 AND
                       SUM(CASE WHEN CATEGORY_TYPE = 'SUPPLIER_XREF' THEN 1 ELSE 0 END) = 1
               ) r;
          

          如果你想要正好两个匹配,你不能在聚合之前过滤。

          【讨论】:

            【解决方案5】:

            如果你想让 RETL_ID 至少出现两次,你可以使用这个:

             select RETL_ID, COUNT(retl_id)
                FROM RFI_XREF_DVM
                WHERE CATEGORY_TYPE in ('SUPPLIER_SITE_XREF', 'SUPPLIER_XREF')
                GROUP BY RETL_ID
                HAVING COUNT(retl_id)>= 2;
            

            如果正好是两次,那么:

            select RETL_ID, COUNT(retl_id)
                    FROM RFI_XREF_DVM
                    WHERE CATEGORY_TYPE in ('SUPPLIER_SITE_XREF', 'SUPPLIER_XREF')
                    GROUP BY RETL_ID
                    HAVING COUNT(retl_id)= 2;
            

            【讨论】:

              猜你喜欢
              • 2017-12-18
              • 1970-01-01
              • 2011-03-31
              • 2019-04-29
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2022-08-18
              • 1970-01-01
              相关资源
              最近更新 更多