选择具有groupby和having条件的查询

jgwigjjp  于 2021-07-29  发布在  Java
关注(0)|答案(2)|浏览(329)

块引用
我正在为自己的小公司寻找验证数据的方法,我们有一个复杂的安全数据文件,其中有多个支付相同的投资id。我的最终目标是有一个消息,在我们的系统中弹出,每当我们有一个支付值不同或不相同(涉及每个投资id)。
所以,现在我正在尝试进行一个查询,以识别何时有一个投资id具有不同的payout值(invesment id可以有多个payout,但所有payout必须是完全相同的值)。我对sql还是有点陌生,所以任何建议都将不胜感激。
这是一个缩小的例子,我正在使用的数据文件输入图像描述这里。在这个例子中,投资id 455和543应该标记为错误,因为投资455有一个空值,而投资543有两个不同的值。
我的代码设置在逻辑上是合理的,但由于having语句中的payout\u值不是聚合或group by,因此无法正常运行。如果您有任何提示或方法来解决这个问题,我将非常感谢您。

Select Investment_ID, Payout_# From investment_table

Group BY investment_ID, Payout_# 

Having Sum(payout_value) / Count(payout_#) <> payout_value 

Order by investment_id, payout_#

在此处输入代码
谢谢,乔

mv1qrgav

mv1qrgav1#

你好像在找 investment_id 至少有一个空值的 payout_value ,或至少两个不同的 payout_values .
如果是这样,您可以使用聚合,并使用 having 条款:

select investment_id
from investment_table
group by investment_id
having 
    min(payout_value) <> max(payout_value) 
    or max(case when payout_value is null then 1 else 0 end) = 1

另一方面,如果您希望所有行都用于 investiment_id s、 可以使用聚合:

select *
from (
    select 
        i.*,
        min(payout_value) over(partition by investiment_id) min_payout_value,
        max(payout_value) over(partition by investiment_id) max_payout_value,
        max(case when payout_value is null then 1 else 0 end) over(partition by investiment_id) cnt_null_payout_value
    from investment_table i
) i
where min_payout_value <> max_payout_value or cnt_null_payout_value = 1
pbossiut

pbossiut2#

在这个例子中,投资id 455和543应该标记为错误,因为投资455有一个空值,而投资543有两个不同的值。
您可以这样使用聚合:

select Investment_ID
from investment_table
group by investment_ID
having count(payout_value) <> count(*) or       -- ever NULL
       min(payout_value) <> max(payout_value)   -- different values
order by Investment_ID;

相关问题