如何计算表中列的每个值?
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 if
、end 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
是必需的。
【讨论】:
以上是关于如何计算表中列的每个值?的主要内容,如果未能解决你的问题,请参考以下文章