【问题标题】:SQL Count non existing item with two columnSQL Count nonexisting item with two column
【发布时间】:2013-12-18 13:47:11
【问题描述】:

我问过类似的问题SQL Count non existing item。 但我需要另一个观点。这是我的不同版本的问题。

我有表格组,

ID  NUMBER
STATUS  VARCHAR2(20 BYTE)
OWNER  VARCHAR2(20 BYTE)

我可以统计如下状态的数量。 (也考虑帐户所有者元组)

 select g.owner, g.status, count(*) countRS from groups g group by g.owner, g.status order by g.owner ;  

OWNER                STATUS                  COUNTRS
-------------------- -------------------- ----------
JOHN                 NOK                           1 
JOHN                 OK                            2 
MARK                 OK                            1 

我还有另一个状态,比如 PENDING、REJECTED。但是表中不存在任何项目,但我希望它们以零计数显示,如下所示。

OWNER                STATUS                  COUNTRS
-------------------- -------------------- ----------
JOHN                 NOK                           1 
JOHN                 OK                            2 
JOHN                 PENDING                       0 
JOHN                 REJECTED                      0 
MARK                 OK                            1 
MARK                 NOK                           0
MARK                 PENDING                       0 
MARK                 REJECTED                      0 

【问题讨论】:

  • 应用与其他问题相同的逻辑,您已得到正确答案。
  • 同样的问题也适用:您是否有一个包含所有状态的表格,或者它们只是在您的脑海中?
  • 不,没有包含状态值的表。
  • @Gaby 又名 G. Petrioli。这不是重复的,因为正如我所说,这个问题是我自己提出的那个问题的另一个版本。

标签: sql


【解决方案1】:

下面的这个查询将得到表group上唯一所有者的笛卡尔积到状态记录的数量。然后将结果行连接到表 groups 上,这样我们就可以计算每个所有者的状态数。

SELECT  a.owner, b.status,
        COUNT(g.status) TotalCount
FROM    (SELECT DISTINCT OWNER FROM groups) a
        CROSS JOIN
        (
            SELECT  'NOK' `status` UNION ALL
            SELECT  'OK' `status` UNION ALL
            SELECT  'PENDING' `status` UNION ALL
            SELECT  'REJECTED' `status` 
        ) b
        LEFT JOIN groups g
            ON  a.owner = g.owner
                AND b.status = g.status
GROUP   BY a.owner, b.status
ORDER   BY a.owner, b.status

【讨论】:

  • 出现以下错误。命令行错误:46 列:27 错误报告:SQL 错误:ORA-00911:无效字符 00911.00000 -“无效字符” *原因:标识符可能不以任何开头ASCII 字符,而不是字母和数字。在第一个字符之后也允许使用 $#_。用双引号括起来的标识符可以包含除双引号之外的任何字符。替代引号 (q'#...#') 不能使用空格、制表符或回车作为分隔符。对于所有其他上下文,请参阅 SQL 语言参考手册。 *行动:
【解决方案2】:

将“状态”表添加到您的数据库。将“Groups”表中的“Status”字段更改为“StatusId”,该字段应链接到该新表。然后在您的选择中,您可以右连接“状态”表,这也会在查询结果中给出缺少状态的行。

【讨论】:

    猜你喜欢
    • 2013-05-24
    • 2022-12-01
    • 1970-01-01
    • 2010-09-08
    • 2016-01-14
    • 1970-01-01
    • 1970-01-01
    • 2014-12-12
    • 2013-01-28
    相关资源
    最近更新 更多