我的原始数据库如下:
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
答案 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;