Select Query with Group by and Having condition



blockquote

我目前正试图找到一种方法来验证我自己的小公司的数据,我们有一个复杂的安全数据文件,其中有同一投资ID的多个支出。我的最终目标是在我们的系统中弹出一条消息,每当我们的支出值不同或不相同时(与每个单独的投资ID有关(。

因此,现在我正在尝试进行一个查询,以识别何时存在具有不同支出值的投资ID(投资ID可以有多个支出,但所有支出值必须完全相同(。我对sql还是有点陌生,所以任何建议都将不胜感激。

以下是我使用的数据文件的缩小示例,请在此处输入图像描述。在该示例中,投资ID 455和543应该标记为错误,因为投资455具有NULL值,而投资543具有两个不同的值。

我已经设置了逻辑上有意义的代码,但由于我的have语句中的payout_value不是聚合或分组依据,因此无法正常运行。如果你有任何技巧或方法来解决这个问题,我将非常感谢你。

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_#

在此处输入代码

谢谢,Joe

您似乎在寻找至少有一个空payout_value或至少有两个不同payout_valuesinvestment_id

如果是这样,您可以使用聚合,并使用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_ids的所有行,则可以使用聚合:

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

在这个例子中,投资ID 455和543应该标记错误,因为投资455有一个NULL值,而投资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;

最新更新