在一个 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 将来自多个表的多个查询与连接和计数合并到一个表中