使用不同代码复制记录。选择没有“有用”且至少有一个“未找到”的代码

时间:2013-10-16 19:10:57

标签: sql postgresql count duplicates

我有一个数据库,其中重新检查帐户并更改其状态。他们只有一个帐单日期,但他们的帐户可以有多个状态。我正在使用 postgreSQL 9.2

例如,我们有这些帐户

Account number | Last Name | First Name | bill_date  | code
100001             Doe         John      06-01-2013    useful
100001             Doe         John      06-01-2013    useful
100001             Doe         John      06-01-2013    not found
100001             Doe         John      06-01-2013    useful

Account number | Last Name | First Name | bill_date  | code
100034             Jane         Mary      07-12-2013    notfound
100034             Jane         Mary      07-12-2013    not found
100034             Jane         Mary      07-12-2013    error
100034             Jane         Mary      07-12-2013    error

Account number | Last Name | First Name | bill_date  | code
100021             Smith         Mark      01-11-2013    error
100021             Smith         Mark      01-11-2013    error
100021             Smith         Mark      01-11-2013    error
100021             Smith         Mark      01-11-2013    error

Account number | Last Name | First Name | bill_date  | code
10009             Queen         Mark      01-11-2013    error
10009             Queen         Mark      01-11-2013    useful
10009             Queen         Mark      01-11-2013    error
10009             Queen         Mark      01-11-2013    error

我想让我的查询给我这些代码的结果

我想要计算所有至少获得一个有用的代码的记录

我想要计算所有无用但至少找到一个未找到代码的记录。

所有记录的计数已获得仅错误代码。

所以我的结果看起来像这样

Useful  2   --> John doe, and mark queen
Not Found 1 --> mary jane
Error 1     --> mark smith

我遇到的问题是选择无用但至少有一个找不到的记录。我正在过滤我的查询但是当我搜索未找到的代码时,它仍会返回有用的代码,因为它使用相同的帐户(John doe)。

这是我在下面的查询

select

     case
          when code in ('useful') then code
          else null
     end as code,
     account_number,
     bill_date

from(



select distinct
            code,
            account_number,
            bill_date

      joins for tables go here

           and code in ('useful', 'not found', 'error')



            and bill_date > current_date - interval '2 month'
            and bill_date < current_date



            order by account_number,code, bill_date
)A

这将返回所有未找到的代码,有用的代码将为null。所以john doe的帐户仍会在测试查询中显示为

code      | account num | bill date
             100001        06-01-2013
             100001        06-01-2013
not found    100001        06-01-2013
             100001        06-01-2013

我怎么能不将这些帐户包含在未找到的总数中?它有一个帐户,1找不到,其余的错误那么很好,一个简单的案例。我想在检查所有错误时也会出现同样的问题。

感谢先进的帮助!

1 个答案:

答案 0 :(得分:1)

尝试以下查询:

SELECT code, count(*)
FROM
(
    SELECT "Account number", max( code ) code
    FROM table1
    GROUP BY "Account number"
) alias
GROUP BY code

演示:http://www.sqlfiddle.com/#!12/8afc6/2

查询可能看起来很棘手......它基于状态值的字母顺序:
错误 2.未找到
3.有用的

MAX(状态)返回最后一个状态(按照上面的顺序)和.......
它偶然符合要求的条件:
1.至少一个有用的
2.没用,但至少有一个未找到
3.仅错误