【问题标题】:Count all rows by status按状态计算所有行
【发布时间】:2016-09-24 07:30:43
【问题描述】:

我想用这张表在 PostgreSQL 中存储票证。

CREATE TABLE TICKET(
 ID INTEGER NOT NULL,
 TITLE TEXT,
 STATUS INTEGER,
 LAST_UPDATED DATE,
 CREATED DATE
)
;

我使用“状态”列来设置不同的状态(1、2、3、4)。如何使用一个 SQL 查询按状态统计所有票证?

我希望看到最终结果,例如简单的数字数组:

34, 44, 64, 23

【问题讨论】:

  • 做一个 GROUP BY,使用 count(*)。

标签: sql postgresql postgresql-9.1 postgresql-9.4


【解决方案1】:
Select status, count(*)
from Ticket
group by status

如果您还必须在没有任何票证的情况下显示状态。然后我会按照以下步骤。 将有一个表来存储状态详细信息。没有相同的我们无法知道 Ticket 表中缺少哪个状态

假设表格的状态如下

CREATE TABLE _STATUS(
  STATUS INTEGER,
 STATUS_NAME TEXT
)
;

CREATE TABLE TICKET(
 ID INTEGER NOT NULL,
 TITLE TEXT,
 STATUS INTEGER,
 LAST_UPDATED DATE,
 CREATED DATE
)
;

查询将是

select  s.status,COUNT(t.*)
from _status t left join ticket t
on s.status = t.status
group by s.status

【讨论】:

  • 是的,它可以工作,但如果我没有状态为 4 的票证,我会得到空结果。可能我会在 Java 中获得 NPE。即使我没有状态为 4 的票,我如何才能获得状态?
  • 你们有单独的状态表吗?还是 1,2,3,4 是固定的?
  • 它固定在一个表格列中 - 状态。
  • 我可以再问一个问题吗?事实证明,如果我以这种方式得到结果“32 21 32 12”,那么创建 java 对象会更容易。请给我看一下这个结果的查询示例吗?
  • @peterpenzov 不明白
【解决方案2】:
select status, count(*) from ticket group by status

【讨论】:

    【解决方案3】:
    select status, count(*) from ticket group by status;
    

    【讨论】:

    • 你能给我看一个得到这个结果32 21 32 12的查询示例吗?
    • 不确定我是否理解
    【解决方案4】:

    如果您想要一行中的值,例如:

    SELECT 
      COUNT(CASE WHEN status=1 THEN 1 ELSE NULL END) as '1',
      COUNT(CASE WHEN status=2 THEN 1 ELSE NULL END) as '2',
      COUNT(CASE WHEN status=3 THEN 1 ELSE NULL END) as '3',
      COUNT(CASE WHEN status=4 THEN 1 ELSE NULL END) as '4'
    FROM TICKET;
    

    但是您必须使用任何新的状态代码来更新您的 SQL。

    【讨论】:

    • 这不是答案。问题是“我如何按状态计算所有票”,而不是“选择一行”
    • 这正是所要求的。 OP 想要一行中的结果,如他的示例所示。他在对另一个解决方案的评论中进一步强调了这一点,“事实证明,如果我以这种方式得到他的结果‘32 21 32 12’,那么创建 java 对象将会更加肯定。你能给我看一个查询的例子吗?请问这个结果?”。然后又是另一个,“你能给我展示一个得到这个结果的查询示例吗 32 21 32 12?”
    猜你喜欢
    • 2016-09-24
    • 2018-07-20
    • 2019-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-18
    • 2015-10-21
    相关资源
    最近更新 更多