gpt4 book ai didi

SQL 查询混合聚合结果和单个值

转载 作者:行者123 更新时间:2023-12-04 21:20:29 26 4
gpt4 key购买 nike

我有一张交易表。每个交易都有一个交易 ID、会计期间 (AP)、过账值 (PV) 以及其他字段。一些 ID 是重复的,通常是因为交易是错误的。举个例子,表格的一部分可能看起来像:

ID    PV    AP  
123 100 2
123 -100 5

在这种情况下,事务在 AP2 中添加,然后在 AP5 中删除。

另一个例子是:
ID    PV    AP  
456 100 2
456 -100 5
456 100 8

在第一个示例中,问题在于,如果我正在分析 AP2 中的支出,那么其中有一笔交易实际上不应考虑在内,因为它在 AP5 中再次被取出。在第二个示例中,不应考虑后两个事务,因为它们相互抵消。

我想标记尽可能多的交易,这些交易不应被视为错误。为了识别这些交易,我想找到那些具有重复 ID 且 PV 总和为零(如上面的 ID 123)的交易,或者最早的 PV 等于 sum(PV) 的交易,如第二个示例所示。这第二个条件是什么让我悲伤。

到目前为止我有
SELECT *
FROM table
WHERE table.ID IN (SELECT table.ID
FROM table
GROUP BY table.ID
HAVING COUNT(*) > 1
AND (SUM(table.PV) = 0
OR SUM(table.PV) = <PV of first transaction in each group>))
ORDER BY table.ID;

人字形中的一点是我正在尝试做的,但我被卡住了。我可以这样做吗,或者我可以在 SQL 中使用其他一些方法来做到这一点吗?

编辑 1:顺便说一句,我忘了说我正在使用 SQL Compact 3.5,以防万一。

编辑 2:我认为上面的代码片段有点误导。我仍然想用重复的 ID 标记出 sum(PV) = 0 的事务,如第一个示例所示。但是最早交易的PV = sum(PV),就像第二个例子一样,我真正想要的是保留最早的交易并用相同的ID标记出所有其他交易。抱歉,如果这引起了困惑。

编辑 3:我一直在使用 Clodoaldo 的解决方案并取得了一些进展,但仍然无法得到我想要的。我试图让我知道肯定是错误的交易。假设以下交易也在表中:
ID     PV    AP  
789 100 2
789 200 5
789 -100 8

在这个例子中 sum(PV) <> 0 和最早的 PV <> sum(PV) 所以我不想标记任何这些。

如果我修改 Clodoaldo 的查询如下:
    select t.*
from
t
left join (
select id, min(ap) as ap, sum(pv) as sum_pv
from t
group by id
having sum(pv) <> 0
) s on t.id = s.id and t.ap = s.ap and t.pv = s.sum_pv
where s.id is null

这给出了结果
 ID      PV     AP
123 100 2
123 -100 5
456 -100 5
456 100 8
789 100 3
789 200 5
789 -100 8

虽然前 4 笔交易没问题(它们会被标记出来),但 789 笔交易也在那里,我不想要它们。但是我不知道如何修改查询以便不包括它们。有任何想法吗?

最佳答案

SQL Fiddle

select t.* 
from
t
inner join (
select id, min(ap) as ap
from t
group by id
having sum(pv) <> 0
) s on t.id = s.id and t.ap = s.ap

以上获取有效交易。如果你想要无效的使用这个:
select t.*
from
t
left join (
select id, min(ap) as ap
from t
group by id
having sum(pv) <> 0
) s on t.id = s.id and t.ap = s.ap
where s.id is null

SQL Fiddle

关于SQL 查询混合聚合结果和单个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12803433/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com