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——问题中给出的示例没有任何意义。您的回答没有任何意义有道理。试试看,看看我的意思。