Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL查询;如何仅在一行中的条目数大于另一行中的条目数的情况下显示信息?_Sql_Oracle_Count_Nested Select - Fatal编程技术网

SQL查询;如何仅在一行中的条目数大于另一行中的条目数的情况下显示信息?

SQL查询;如何仅在一行中的条目数大于另一行中的条目数的情况下显示信息?,sql,oracle,count,nested-select,Sql,Oracle,Count,Nested Select,超级简化代码: SELECT lots_of_stuff. , A.more_stuff , B.stuff , C.things FROM table A, table B, table C, where (B.more_stuff = A.stuff) and things and stuff and lots more things and this query has so much crap believe me and finally and count(sel

超级简化代码:

SELECT lots_of_stuff.
 , A.more_stuff
 , B.stuff
 , C.things
FROM
 table A,
 table B,
 table C,
where (B.more_stuff = A.stuff)
 and things and stuff
 and lots more things
 and this query has so much crap believe me
 and finally
 and count(select c.things from table C where c.things like 'CRED') 
    > count(select c.things from table C where c.things like 'PUR')
;
所以问题是最后一点不起作用(我肯定我完全做错了,这只是关于如何做的一个猜测。)我想知道是否有人能给我一些建议

我试图做的只是在特定字段中包含“CRED”的行数大于特定字段中包含“PUR”的行数的情况下返回所需的字段。(同一个字段,如果可以简化的话。)我希望它们能够被返回,无论“CRED”或“PUR”是较长单词(信用/购买)的一部分还是单独返回。但他们永远都是帽子

编辑:

我要找的只是我指定的那些列

| More_Stuff | Stuff | Things |
|   dshsdh   |  dfh  |  tjra  |
|   ddh      |  ash  |  ytra  |
|   shsdh    |  fgh  |  sayh  |
|   hsdh     |  gnh  |  tshn  |
但只有信用代码多于购买计划的客户的行。因此,如果他们在“c.things”中有3个不同的条目,如“电话信用”或“抵消信用”。在“c.things”中有2个不同的条目,如“12 M采购计划”或“促销采购36”,我希望他们的信息显示出来。因此,当具有任何信用代码的行数大于具有任何采购计划的行数时。
我当前的非简化查询已设置为对所有客户进行排序,我只需要指定基于此筛选器的客户。

我想您需要类似的内容

 WITH cred_count AS
 (
    SELECT index_field, SUM(CASE WHEN field='CRED' THEN 1 ELSE 0 END) AS cred_count
    FROM some_table
    GROUP BY index_field
 ), pur_count AS
 (
    SELECT index_field, SUM(CASE WHEN field='PUR' THEN 1 ELSE 0 END) AS pur_count
    FROM some_table
    GROUP BY index_field
 )
 SELECT somestuff
 FROM some_table
 LEFT JOIN cred_count ON some_table.index_field = cred_count.index_field
 LEFT JOIN pur_count ON some_table.index_field = pur_count.index_field
 WHERE COALESCE(cred_count.cred_count,0) > COALESCE(pur_count.pur_count,0)
注意:您可以将WHEN部分更改为您想要计数的任何内容(例如,
类似“%PUR%”的WHEN字段将对包含字符串PUR的行进行计数


另外,我假设没有任何条目被计算为0——您在这种情况下的业务规则可能会有所不同。

我想您需要这样的东西

 WITH cred_count AS
 (
    SELECT index_field, SUM(CASE WHEN field='CRED' THEN 1 ELSE 0 END) AS cred_count
    FROM some_table
    GROUP BY index_field
 ), pur_count AS
 (
    SELECT index_field, SUM(CASE WHEN field='PUR' THEN 1 ELSE 0 END) AS pur_count
    FROM some_table
    GROUP BY index_field
 )
 SELECT somestuff
 FROM some_table
 LEFT JOIN cred_count ON some_table.index_field = cred_count.index_field
 LEFT JOIN pur_count ON some_table.index_field = pur_count.index_field
 WHERE COALESCE(cred_count.cred_count,0) > COALESCE(pur_count.pur_count,0)
注意:您可以将WHEN部分更改为您想要计数的任何内容(例如,
类似“%PUR%”的WHEN字段将对包含字符串PUR的行进行计数


另外,我假设没有任何条目被计算为0——您在这种情况下的业务规则可能会有所不同。

要过滤较长单词中的CRED和PUR,请在查询中使用通配符,如%

like '%CRED%'  -- if CRED can be anywhere in the string
like 'CRED%'  -- if CRED is always at the beginning of the string
请注意,如果它始终位于字符串的开头,则可以在列上使用索引使其运行更快

不能在where子句中使用类似count()的聚合(除非Oracle支持它??)

您可以对行进行分组并使用have,但在您的情况下,在子查询中移动count()实际上更容易

   SELECT lots_of_stuff.
 , A.more_stuff
 , B.stuff
 , C.things
FROM
 table A,
 table B,
 table C,
where (B.more_stuff = A.stuff)
 and things and stuff
 and lots more things
 and this query has so much crap believe me
 and finally
 and (select count(c.things) from table C where c.things like '%CRED%') 
    > (select count(c.things) from table C where c.things like '%PUR%')
;

要过滤较长单词中的CRED和PUR,请在查询中使用通配符,如%

like '%CRED%'  -- if CRED can be anywhere in the string
like 'CRED%'  -- if CRED is always at the beginning of the string
请注意,如果它始终位于字符串的开头,则可以在列上使用索引使其运行更快

不能在where子句中使用类似count()的聚合(除非Oracle支持它??)

您可以对行进行分组并使用have,但在您的情况下,在子查询中移动count()实际上更容易

   SELECT lots_of_stuff.
 , A.more_stuff
 , B.stuff
 , C.things
FROM
 table A,
 table B,
 table C,
where (B.more_stuff = A.stuff)
 and things and stuff
 and lots more things
 and this query has so much crap believe me
 and finally
 and (select count(c.things) from table C where c.things like '%CRED%') 
    > (select count(c.things) from table C where c.things like '%PUR%')
;
这可以通过在Oracle中使用WITH子句来实现 可能很接近你要找的东西-

这可以通过在Oracle中使用WITH子句来实现 可能很接近你要找的东西-



示例数据和期望的结果将非常有用。示例数据和期望的结果将非常有用。什么是所有列?这不仅仅是更改为通配符。您的答案没有触及需要做什么或如何做的核心。例如,您没有连接ds1和ds2——正如编写的那样,您正在执行所有行的交叉连接。非常确定这一点这不是他想要的。目前来看,如果我尝试使用它,我会得到一个“不允许使用组函数”错误。@Hogan-我同意这不准确,我的重点是让用户了解如何实现这一点,因为实际的查询没有发布在这里。什么是所有列?这不仅仅是更改为通配符。您的答案没有触及需要做什么或如何做的核心。例如,您没有以write的形式加入ds1和ds2恩,你正在做一个所有行的交叉连接。相当肯定这不是他想要的。现在如果我尝试使用这个,我会得到一个“不允许使用组函数”错误。@Hogan-我同意这不准确,我的重点是让用户了解如何实现这一点,因为实际的查询没有发布在这里。此筛选器如何工作?它与选定的表A、B或C无关。这是基于问题中给出的示例,其中计数与其他表无关。行wil只有当CRED大于PUR时,才会返回l。如果您想查看CRED和PUR,并使用更多筛选器,则需要将筛选器添加到子查询中。我不想显示c中的内容。我只需要按它进行筛选。我只希望某些字段仅显示那些信用代码多于购买计划的客户。仅在如果这令人困惑,那么表的别名不区分大小写。因此表C与表C相同;C。事情来自表C。@Ghislain——问题中给出的示例没有任何意义。您的答案没有任何意义。请尝试测试,看看我的意思。此筛选器如何工作?它与所选表a无关,B、 或C。这是基于问题中给出的示例,其中计数与其他表不相关。只有当CRED多于PUR时,才会返回行。如果要查看CRED和PUR的筛选器更多,则需要将筛选器添加到子查询中。我不想显示C中的内容,我只需要按它进行筛选。我只是希望某些字段只显示那些信用代码多于购买计划的客户。为了避免混淆,表的别名不区分大小写。因此表C与表C相同;C。事情来自表C。@Ghislain——问题中给出的示例没有任何意义。您的回答没有任何意义有道理。试试看,看看我的意思。