SQL计数首次出现

时间:2019-07-24 15:56:15

标签: sql distinct

我的原始数据库如下:

TYPE CONTRACT_ID
a    101011 
c    101012
b    101011
b    101012
a    101011-1
c    101012

我试图获取按类型分组的数据,并计算唯一的CONTRACT_ID,但是有些合同有分包合同,例如101011有分包合同101011-1。所有这些都必须算作一份合同。

我尝试了与众不同的方法,但它的确有效,但仅部分原因是因为那些分包合同仍被视为唯一的主菜。

SELECT TYPE, count(distinct CONTRACT_ID) as countocc
FROM db_address
group by TYPE

我希望这样的输出:

TYPE  countocc
a     1 
b     2
c     1

3 个答案:

答案 0 :(得分:1)

如何完全忽略分包合同?拥有订阅者时,您似乎拥有父合约:

SELECT TYPE, count(distinct CONTRACT_ID) as countocc
FROM db_address
WHERE CONTRACT_ID NOT LIKE '%-%'
GROUP BY TYPE;

答案 1 :(得分:0)

使用LoadFromText语句仅计算CASE之前contract_id的部分(如果存在):

'-'

这涵盖了表中有分包合同而不是主合同的情况(如果有这种情况)。
该代码适用于MySql,但所有使用的功能都可以在任何rdbms中找到。
请参见demo
结果:

select 
  type,
  count(distinct 
    case 
      when contract_id like '%-%' then 
        substring(contract_id, 1, instr(contract_id, '-') - 1)
      else contract_id
    end
  ) counter
from db_address
group by type

答案 2 :(得分:0)

逻辑可能是提取字符串的一部分直到破折号(如果存在),然后按type列进行分组。但是方法取决于DBMS

如果您使用的是 Oracle ,请考虑:

select type, 
       count( distinct
             case when instr(contract_id,'-') > 0 then
                  substr(contract_id,1,instr(contract_id,'-')-1)
             else
                  contract_id
             end) as countocc
  from db_address d
 group by type 

如果 SQL Server ,请考虑:

select type, 
       count( distinct
             case when charindex('-',contract_id) > 0 then
                  left(contract_id,charindex('-',contract_id)-1)
             else
                  contract_id
             end) as countocc
  from db_address d
 group by type;

如果 MySQL ,请考虑:

select type, 
       count(distinct substring(contract_id,1,instr(contract_id,'-')-1)) as countocc
  from db_address d
 group by type;

如果 PostGRES ,请考虑:

select type, 
       count( distinct
             case when strpos(contract_id,'-') > 0 then
                  substr(contract_id,1,strpos(contract_id,'-')-1)
             else
                  contract_id
             end) as countocc
  from db_address d
 group by type;