查找与多个匹配条件的备用ID连接的ID

时间:2014-11-18 01:01:24

标签: sql oracle

我猜这是一个快速而简单的解决方案,但我已经尝试了许多不同的方法并继续撞墙。尝试在这里和其他地方搜索很多,但我不认为我正在使用正确的词语来澄清我想知道的东西(根据我令人困惑的主题!)。如果这是重复或类似的,我道歉。

所以,为了解释这个问题(因为实际数据有些敏感而模糊不清),假设你有一个客户表,一个与这些客户会面的会议表(会议可能有多个客户端绑在一起),以及另一张在会议期间向这些客户收取费用的表格。单次会议可能会收取单项或多项费用(即咨询费,新合同费,购买费等)。

我试图找到的是系统可能错误地向客户收取相同类型费用的多份副本的任何情况,即每次会议只能收取一次的咨询费。

识别这种方式的方法是找到那种类型的费用(让我们说CONS用于咨询),然后检查是否有多个不同的 fee_id 与该类型相关联单个 meeting_id 。在同一次会议中,您可能有10行用于相同的 fee_type (例如,参加同一会议的10位客户),但它们都应该绑定到相同的 fee_id

我尝试的解决方案似乎要么将这些作为10个条目(它应该只计为一个),要么单独计算行数并且不将它们全部分组到同一个会议中等等。

这里是一个简单粗略的例子(尽管这是错误的,因为它没有将独特的计数分组到唯一的 meeting_id 中) :

select c.client_name as "Client"
    , m.meeting_id as "Meeting ID"
    , m.meeting_date as "Meeting Date"
    , f.fee_type as "Fee Type"
    , count(distinct 
        (
            case when f.fee_type = 'CONS'
            then f.fee_id 
            else null 
            end
        )
    ) as "Consultation Fees Charged"
from client c
inner join meetings m
    on c.client_id = m.client_id
inner join fees f
    on m.meeting_id = f.meeting_id
where f.fee_type = ‘CONS’
group by c.client_name, m.meeting_id, m.meeting_date

我确定这是一个简单的解决方案,我只是遗漏了一些明显的东西。对不起,大量的文字。

3 个答案:

答案 0 :(得分:0)

我不是百分之百,我明白你在寻找什么。我认为是某种类型的费用适用于特定客户的特定会议。如果是这样,您的基本查询就在正确的轨道上,但它需要group by并且case中的一些简化(casewhere是多余的):< / p>

select c.client_name as "Client", m.meeting_id as "Meeting ID", m.meeting_date as "Meeting Date",
       count(distinct f.fee_id ) as "Consultation Fees Charged"
from client c inner join
     meetings m
     on c.client_id = m.client_id inner join
     fees f
     on m.meeting_id = f.meeting_id
where f.fee_type = 'CONS'
group by c.client_name, m.meeting_id, m.meeting_date
having count(*) > 1;

答案 1 :(得分:0)

要查找系统可能错误地向客户收取相同类型费用的多个副本的实例,我们可以使用GROUP BY然后检查会议中的总客户端数,并且每个会议的总费用数字匹配使用HAVING条款。

以下查询将返回所有此类会议,其中consultation fees

存在差异
SELECT m.meeting_id as "Meeting ID", 
       m.meeting_date as "Meeting Date",
       count(f.fee_id ) as "Total Fee record count",
       count(c.client_name) as "Total Client count"
FROM client c 
INNER JOIN  meetings m
ON c.client_id = m.client_id 
INNER JOIN fees f
on m.meeting_id = f.meeting_id
AND f.fee_type = 'CONS'
group by c.client_name, m.meeting_id, m.meeting_date
having count(f.fee_id) <> count(c.client_name);

答案 2 :(得分:0)

您可以通过查找客户之间的差额和收取的费用之间的差异来检查收取的重复费用.IF为零然后没有重复费用,否则收取重复费用

 select count(distinct c.client_name) as "Client",
   m.meeting_id as "Meeting ID",
   m.meeting_date as "Meeting Date",
   f.fee_type as "Fee Type",
   count(distinct f.fee_id) as "Consultation Fees Charged",
   (count(distinct f.fee_id) - count(distinct c.client_name)) as "Duplicate fee charged"
      from client c
      inner join meetings m on c.client_id = m.client_id
      inner join fees f on m.meeting_id = f.meeting_id
      where f.fee_type = ‘CONS’
      group by m.meeting_id, m.meeting_date, f.fee_type