Sql 为什么使用现有查询得到的输出是“不正确的”-我觉得这很好。如果顶部第5行的值不是20而是40呢?那么,您想在输出中包含从#3到#5的所有三行吗?如果没有,还有什么额外的规则?但这也是比较的一个重要因素。负数和正数的日期应相同。另外,逻辑类似于显示b.amo
Sql 为什么使用现有查询得到的输出是“不正确的”-我觉得这很好。如果顶部第5行的值不是20而是40呢?那么,您想在输出中包含从#3到#5的所有三行吗?如果没有,还有什么额外的规则?但这也是比较的一个重要因素。负数和正数的日期应相同。另外,逻辑类似于显示b.amo,sql,oracle,Sql,Oracle,为什么使用现有查询得到的输出是“不正确的”-我觉得这很好。如果顶部第5行的值不是20而是40呢?那么,您想在输出中包含从#3到#5的所有三行吗?如果没有,还有什么额外的规则?但这也是比较的一个重要因素。负数和正数的日期应相同。另外,逻辑类似于显示b.amount+a.amount=0。因此,例如,如果给定Id、代码、健康计划和日期的金额分别为10、-10和10,那么它将只显示10和-10,因为结果为0。目前缺少b.amount+a.amount=0的比较。正如上面评论中提到的,您可以将健康计划添
为什么使用现有查询得到的输出是“不正确的”-我觉得这很好。如果顶部第5行的值不是20而是40呢?那么,您想在输出中包含从#3到#5的所有三行吗?如果没有,还有什么额外的规则?但这也是比较的一个重要因素。负数和正数的日期应相同。另外,逻辑类似于显示b.amount+a.amount=0。因此,例如,如果给定Id、代码、健康计划和日期的金额分别为10、-10和10,那么它将只显示10和-10,因为结果为0。目前缺少b.amount+a.amount=0的比较。正如上面评论中提到的,您可以将健康计划添加到示例数据中。我在查询中尝试了逻辑b.amount+a.amount=0,但它不起作用。这就是我问这个问题的原因。因为数量对于查询也很重要,我现在将它作为绝对值添加到where选择中。我添加了在db实例上运行时有效的金额比较。金额列是典型的整数还是浮点数据类型?然后你应该通过“和ABS(b.amount+a.amount)<0.00001”进行比较,但这也是比较的一个重要元素。负数和正数的日期应相同。另外,逻辑类似于显示b.amount+a.amount=0。因此,例如,如果给定Id、代码、健康计划和日期的金额分别为10、-10和10,那么它将只显示10和-10,因为结果为0。目前缺少b.amount+a.amount=0的比较。正如上面评论中提到的,您可以将健康计划添加到示例数据中。我在查询中尝试了逻辑b.amount+a.amount=0,但它不起作用。这就是我问这个问题的原因。因为数量对于查询也很重要,我现在将它作为绝对值添加到where选择中。我添加了在db实例上运行时有效的金额比较。金额列是典型的整数还是浮点数据类型?然后你应该通过“和ABS(b.amount+a.amount)<0.00001”进行比较
ID code date amount health_plan
111 A123 20170101 10 BH
111 A123 20100101 -10 BH
311 A124 20170712 20 CVA
311 A124 20170712 -20 CVA
311 A124 20170712 20 CVA
311 A124 20180201 55 CVA
111 A123 20170101 10 BH
111 A123 20100101 -10 BH
311 A124 20170712 20 CVA
311 A124 20170712 -20 CVA
WITH amt_cur
AS (SELECT DISTINCT first_name,
last_name,
birth_date,
gender,
health_plan,
id,
code,
date,
amount
FROM table_a
WHERE (id,
code,
date,
health_plan) IN
(SELECT a.id,
a.code,
a.date,
a.health_plan
FROM table_a a
JOIN table_a b
ON b.health_plan = a.health_plan
AND b.id = a.id
AND b.date = a.date
AND b.code = a.code
AND b.amount <> a.amount
AND (a.amount > 0 AND b.amount < 0)))
SELECT *
FROM amt_cur
ORDER BY id, code, date;
111 A123 20170101 10 BH
111 A123 20100101 -10 BH
311 A124 20170712 20 CVA
311 A124 20170712 -20 CVA
311 A124 20170712 20 CVA
WITH amt_cur
AS (SELECT MAX(first_name) first_name,
MAX(last_name) last_name,
MAX(birth_date) birth_date,
MAX(gender) gender,
health_plan,
id,
code,
"date",
amount
FROM table_a
WHERE (id,
code,
"date",
health_plan,
ABS(amount)) IN
(SELECT distinct a.id,
a.code,
a."date",
a.health_plan,
ABS(a.amount)
FROM table_a a
JOIN table_a b
ON b.health_plan = a.health_plan
AND b.id = a.id
AND b."date" = a."date"
AND b.code = a.code
AND ABS(b.amount + a.amount) < 0.00001
AND (a.amount > 0 AND b.amount < 0))
GROUP BY health_plan, id, code, "date", amount
)
SELECT *
FROM amt_cur
ORDER BY id, code, "date";
with t as (
select a.* , count(distinct a.amount)over(partition by a.id,a."DATE",a.code,a.health_plan) "count"
, sum (a.amount) over(partition by a.id,a."DATE",a.code,a.health_plan) "sum"
from table_a a
)
select a.id,a.code,a."DATE",a.amount
from t a where "count">1 and "sum"=0
;
select t.*
from t
where exists (select 1 from t t2 where t2.id = t.id and t2.amount < 0) and
exists (select 1 from t t2 where t2.id = t.id and t2.amount > 0) ;