使用 SQL 服务器根据列计算不同的行

Counting Distinct rows based on column using SQL Server

我有2个table,一个parent (table a)和一个child (Table B)。对于每个 parent 可以有多个 children(行)。我需要的是,如果在 children 中满足某些条件,我需要它算作 1。

目前,我的代码正在计算每个 child 到 parent,它不应该那样工作。这是我的简化代码。

SELECT 
  cl.clientID, cl.code, cl.cName, 
  COUNT(case when e.errorCode NOT IN('DP','RB','WP','PE','OV') then c.rID end) as rateCount,
  SUM(case when e.errorCode NOT IN('DP','RB','WP','PE','OV') then e.refundDue else 0.0 end) as rateAmount,
  COUNT(case when e.errorCode IN('DP','RB','WP','PE','OV') then c.rID end) as paymentCount, 
  SUM(case when e.errorCode IN('DP','RB','WP','PE','OV') then e.refundDue else 0.0 end) as paymentAmount 

  FROM claims c 

  INNER JOIN clients cl ON cl.code=c.client 
  INNER JOIN entries e ON e.rID=c.rID 

  WHERE 

  status='closed' AND c.carrierID IN(3909) AND 
  (c.dateon >= '20170624' AND c.dateon < '20171220') 

  GROUP BY cl.clientID, cl.code, cl.cName ORDER BY cl.cName ASC

因此,同样,在计数语句中,当满足条件时,它不是计算 1 个实例,而是计算所有 children。将 parent(声明)连接到 child(条目)的是 parents rID。我希望这很清楚,但可以肯定的是,

索赔

rID   name
------------------
1     Damien
2     Jim

条数

eID  rID  name
------------------
1    1    Yeye
2    1    Juju
3    1    Nao
4    1    Ty
5    2    Pai
6    2    Cha
7    2    Jac

所以在这种情况下,Damien 我应该得到 1,因为是的,他有 children,Jim 也应该得到 1。

这是上面的结果 SQL:

以下是 table:

看来你并不是真的"counting",而是你在设置旗帜。这应该能找到您要找的东西:

SELECT 
  c.name 
  ,HasChild = CASE WHEN EXISTS (SELECT 1 FROM entries e WHERE e.rID = c.rID and e.errorCode NOT IN('DP','RB','WP','PE','OV')) THEN 1
                    ELSE 0
                    END    
FROM claims c

编辑: 没有来自每个 table 的示例数据,我无法真正对此进行测试,但看来您可能需要使用 COUNT(DISTINCT)。试试这个:

SELECT
    cl.clientID
    ,cl.code
    ,cl.cName
    ,COUNT(DISTINCT CASE WHEN e.errorCode NOT IN ('DP', 'RB', 'WP', 'PE', 'OV') THEN
                    c.rID END
          )                                                                        AS rateCount
    ,SUM(CASE WHEN e.errorCode NOT IN ('DP', 'RB', 'WP', 'PE', 'OV') THEN
                  e.refundDue ELSE 0.0 END
        )                                                                          AS rateAmount
    ,COUNT(DISTINCT CASE WHEN e.errorCode IN ('DP', 'RB', 'WP', 'PE', 'OV') THEN c.rID END) AS paymentCount
    ,SUM(CASE WHEN e.errorCode IN ('DP', 'RB', 'WP', 'PE', 'OV') THEN
                  e.refundDue ELSE 0.0 END
        )                                                                          AS paymentAmount
FROM claims        c
INNER JOIN clients cl ON cl.code = c.client
INNER JOIN entries e ON e.rID = c.rID
WHERE status = 'closed'
    AND c.carrierID IN (3909)
    AND (c.dateon >= '20170624' AND c.dateon < '20171220')
GROUP BY cl.clientID
    ,cl.code
    ,cl.cName
ORDER BY cl.cName ASC;

在子查询的帮助下,您可以尝试类似的操作:

SELECT cl.clientID, cl.code, cl.cName,
case (select count(*) from entries e where e.rID=c.rID and e.errorCode
NOT IN('DP','RB','WP','PE','OV')) when 0 then 0 else 1 end  as rateCount 
FROM claims c 
    INNER JOIN clients cl ON cl.code=c.client 

GROUP BY cl.clientID, cl.code, cl.cName, rateCount  ORDER BY cl.cName ASC

另一种方法

使用常见的 table 表达式,您可以尝试如下操作:

WITH CTE AS (
select c.client, CASE count(*) WHEN 0 THEN 0 ELSE 1 END AS rateCount  
from entries e inner join claims c on c.rID = e.rID where e.errorCode
    NOT IN('DP','RB','WP','PE','OV') GROUP BY c.client
)   
SELECT cl.clientID, cl.code, cl.cName, coalesce( rateCount,0) as rateCount  
from CTE c right join clients cl on cl.code = c.client