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_values
的investment_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_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
在这个例子中,投资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;