如何计算表中列的每个值?

Posted

技术标签:

【中文标题】如何计算表中列的每个值?【英文标题】:How to count each value of a column in a table? 【发布时间】:2010-09-21 13:49:23 【问题描述】:

我有一张这样的桌子:

UserID     Customer ID status        
1               1          1
1               2          1 
1               3          1
1               4          2
1               5          1
1               6          3
1               7          2
2               8          1
2               9          2 
 ........

我想把这张表总结一下:

 UserID           count(status 1)    count(status 2)   count(status 3)
    1                4                2                     1 
    2                1                2                     3
   .........

如何在 PL/SQL 中做到这一点?

提前致谢

【问题讨论】:

Oracle 的哪个版本?如果您使用的是 11,则可以使用 PIVOT 轻松完成此操作。 【参考方案1】:

您可以对 UserId 进行分组并总结不同的状态码。

类似:

select
  UserId,
  sum(case status when 1 then 1 else 0 end) as Status1,
  sum(case status when 2 then 1 else 0 end) as Status2,
  sum(case status when 3 then 1 else 0 end) as Status3
from SomeTable
group by UserId
order by UserId

您也可以考虑简单地对 UserId 和状态进行分组,尽管结果的布局当然不同:

select UserId, status, count(*)
from SomeTable
group by UserId, status
order by UserId, status

【讨论】:

当我将第一个查询中的“end case”替换为“end”(删除大小写)时,查询运行,否则将处理“ORA-00907:缺少右括号”。你能解释一下吗? 你不应该在 oracle 中使用end case。只使用end @Vimvq1987:显然正确的语法是case ... end,而不是case ... end case。我检查了这个页面的语法,但它似乎是错误的:oracle.com/technology/sample_code/tech/pl_sql/htdocs/x/Case/… 在 PL/SQL 语句中需要 end case(类似于 end ifend loop),但在 SQL 查询中只需要 end,即使它们位于 PL/SQL 块中.【参考方案2】:
select userid, 
       count(decode(status, 1, 1, null)),
       count(decode(status, 2, 1, null)),
       count(decode(status, 3, 1, null)),
  from table
 group by userid

【讨论】:

【参考方案3】:
SELECT *
  FROM ( SELECT UserID,
                status,
                COUNT(status)
           FROM <table>
          GROUP BY UserID,
                   status
       )
 PIVOT(COUNT(status) FOR status IN (1,2,3))

【讨论】:

【参考方案4】:

只是跟进@Vimvq1987 和@Guffa cmets:SQL 的正确语法是case ... end,但对于PL/SQL,它应该是case ... end case,所以您提供的链接上的信息是正确的。

因此,在您的 SQL 查询中(无论是在 SQL-Plus 中执行,还是在 PL/SQL 中的 DML 中执行),您应该使用 case ... end,但在 PL/SQL 例程中,case ... end case 是必需的。

【讨论】:

以上是关于如何计算表中列的每个值?的主要内容,如果未能解决你的问题,请参考以下文章

如何检查我的表中列的任何值是不是包含 MS ACCESS 2003 中的尾随空格?

如何复制临时表中列的默认约束?

更新查询以根据另一表中的值更改一个表中列的现有值

如何修改 MySQL 表中列的大小?

如何仅提取此表中列的数字部分? (Python)

如何跟踪数据库表中列的位置