在一个 sql 命令中从一个数据库表中选择多个计数

Posted

技术标签:

【中文标题】在一个 sql 命令中从一个数据库表中选择多个计数【英文标题】:Select multiple counts from one database table in one sql command 【发布时间】:2011-06-23 13:14:52 【问题描述】:

我有一个像这样的 Oracle 数据库表,它记录了在扫描点被扫描的项目。

ItemsScanItemScanIdItemScanPointItemType扫描时间

我想返回 ItemScanPoint 以及在该 ItemScanPoint 扫描特定 ItemType 的次数。

类似的东西..

SELECT ItemScanPoint,
       (SELECT COUNT(*) WHERE ItemType = 1),
       (SELECT COUNT(*) WHERE ItemType = 2)
FROM   ItemsScan

我如何在 oracle 中做到这一点?

什么是最有效的方法?

【问题讨论】:

【参考方案1】:

这对你有用吗?

select count(ItemScanId), itemscanpoint, itemtype
from itemsscan
where itemtype in (1,2)
group by itemtype, itemscanpoint

【讨论】:

我更喜欢一条 SQL 命令,它有一个select itemscanpoint, count(itemType1), count(itemType2), count(itemTypeX) 形式的选择命令。以便在一条记录中返回项目扫描点名称和所有计数。 @endorphin: 形式...什么? 对不起,没有意识到 Enter 提交评论。我已经编辑了原件。【参考方案2】:

Count 是 oracle 中的一个分组函数。试试这个:

选择 物品种类, 计数(项目类型) 从 物品扫描 通过...分组 物品种类

【讨论】:

【参考方案3】:
SELECT   ItemScanPoint,
         SUM(CASE ItemType WHEN 1 THEN 1 ELSE 0 END) ,
         SUM(CASE ItemType WHEN 2 THEN 1 ELSE 0 END)   
FROM     ItemsScan 
GROUP BY ItemScanPoint

【讨论】:

@endorphin,这可能是最好的解决方案,因为 CASE 是标准 SQL,但也可以使用 Oracle DECODE() 函数,例如 SUM(DECODE(ItemType, 1, 1, 0)), SUM(DECODE(ItemType, 2, 1, 0))。如果您不需要便携式解决方案,可能会节省一些按键操作。【参考方案4】:

也可以使用 COUNT() 作为分析函数来做到这一点:

SELECT DISTINCT ItemScanPoint, ItemType
     , COUNT(ItemScanId) OVER (PARTITION BY ItemScanPoint, ItemType)
  FROM ItemsScan

它将以与 OP 中要求的格式不同的格式返回数据,但它将返回 ItemType所有值的结果,而不仅仅是两个。

希望这会有所帮助。

【讨论】:

以上是关于在一个 sql 命令中从一个数据库表中选择多个计数的主要内容,如果未能解决你的问题,请参考以下文章

使用 LINQ 和实体框架在一个 SQL 查询中从多个表中提取数据

SQL 2012 将来自多个表的多个查询与连接和计数合并到一个表中

从多个表中选择多个值的计数

Oracle SQL:从一个表中选择一个计数,从另一个表中使用子查询缩小选择范围

一次返回多个动态选择查询

Laravel中从一个表到另一个表中的同一字段的多个外键