sql - 具有不同代码的重复记录。选择没有 'useful' 且至少有一个 'not found' 的代码

标签 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

这将返回所有未找到的代码,然后有用的代码将为空。所以 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,其余错误则很好,而且很简单。我想在检查所有错误时也会出现同样的问题。

感谢高级的帮助!

最佳答案

试试下面的查询:

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

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

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

关于sql - 具有不同代码的重复记录。选择没有 'useful' 且至少有一个 'not found' 的代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19411773/

相关文章:

google-app-engine - 如何获取数据存储中表中的行数?

MYSQL - 每日总注册量

sql - 所需的列百分比

postgresql - 无法将主机名 "postgres"转换为地址 : Name or service not known

sql - SQL Server 中求和函数的工作方式

ruby-on-rails - 在本地使用 sqlite3 在 Heroku 上设置 Rails 3.2.2 应用程序

postgresql - Sailsjs 模型对象不为 Postgresql 返回数据

php - 你能在 mysql 中对不同的列进行分组和计数吗?

mysql - 最多选择 2 行,其中一列具有相同的值

java - SQL "SCRIPT"命令备份 h2 数据库