【问题标题】:Count Rows using Multiple Select Statements使用多选语句计算行数
【发布时间】:2015-10-12 15:35:10
【问题描述】:

目的是从多个(总共 9 个)SELECT 语句中计算行数,并在 PHP 页面上显示应用程序中的行数。使用 Oracle 11g 数据库

不要关心在这里选择任何内容 - 只需要行数。

我还没有找到使用 Oracle 和使用 Select 语句计算行数的好方法。

使用 Multiple Selects 和 Oracle 计算行数然后显示在 PHP 页面上的最佳方法是什么??

请举例说明

这是我所拥有的,但要这样做 9 次

$query  = oci_parse($conn, "SELECT ID"
. " FROM TABLE A"
. " WHERE (FieldX = 'N' AND FieldY = 'Y' AND FieldZ = 'Y')");

oci_execute($query) or die(oci_error($query));
oci_fetch_all($query, $array);
unset($array);
$numberofrows1 = oci_num_rows($query); 

我怎样才能提高效率??

我尝试在 SELECT 中使用已编入索引的字段或 PK...

【问题讨论】:

  • 为什么不直接选择 count(...)?看起来您正在选择数据,然后计算返回的行数,如果您只想要一个计数,则没有必要
  • 您当然希望使用聚合函数(例如count(*)),而不是获取数据和计数。您对同一张表的所有查询是否都具有不同的标准?如果是这样,您可以通过执行sum( case when x = 'N' and y = 'Y' and z = 'Y' then 1 else 0 end) 并针对每组条件重复进行一次查询,返回 1 行,其中 9 个不同的列具有不同的计数。
  • 贾斯汀 - 来自同一张表的所有查询 - 只是不同的 WHERE 条件......是的,case 语句会有所帮助 - 我会重写

标签: sql database oracle select count


【解决方案1】:

这个:

$query  = oci_parse($conn, "SELECT COUNT( * ) the_count"
. " FROM TABLE a"
. " WHERE FieldX = 'N'"
. " AND FieldY   = 'Y'"
. " AND FieldZ   = 'Y'");

oci_execute($query) or die(oci_error($query));
oci_fetch_all($query, $array);

将返回一行,其中一列名为 THE_COUNT,其中包含表 A 中符合指定条件的行数。

【讨论】:

    【解决方案2】:

    如果您正在寻找 FieldX、Y 和 Z 的所有可能组合,您可以使用这个:

    select pvt.*
      from (select FieldX, FieldY, FieldZ from a)
      PIVOT ( count(*) cnt
        FOR ( FieldX, FieldY, FieldZ)
         IN ( ('N', 'N', 'N') as N_N_N
            , ('N', 'N', 'Y') as N_N_Y
            , ('N', 'Y', 'N') as N_Y_N
            , ('N', 'Y', 'Y') as N_Y_Y
            , ('Y', 'N', 'N') as Y_N_N
            , ('Y', 'N', 'Y') as Y_N_Y
            , ('Y', 'Y', 'N') as Y_Y_N
            , ('Y', 'Y', 'Y') as Y_Y_Y )
            ) pvt
    

    您可能想要稍微重命名列,但它会返回一行,其中的列对应于 FieldX、FieldY 和 FieldZ 的每个可能组合的计数。

    如果您在子选择中包含其他列,您将获得按这些附加列分组的计数。

    【讨论】:

    • 这假定 'N' 和 'Y' 是这三个字段的唯一有效值。
    • 您可以通过将from (select FieldX, FieldY, FieldZ from a) 更改为from (select count(*) over () total_cnt, FieldX, FieldY, FieldZ from a) 或将选择列表更改为select pvt.*, N_N_N_CNT+N_N_Y_CNT+...Y_Y_Y_CNT TOTAL_CNT 来添加total_count
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-02
    • 1970-01-01
    • 1970-01-01
    • 2020-01-08
    相关资源
    最近更新 更多