我正在运行Oracle 11g查询,返回如下结果:
|ID| VALUE|
|01| 2|
|02| 1|
|03| 5|
|04| 1|
|05| 4|
|06| 2|
所以当我要求“ID为4的ID组”时,我收到:
|01| 2|
|06| 2|
OR
|01| 2|
|02| 1|
|04| 1|
我不关心它是哪一组,它只需要是精确的SUM。
奖金问题:如何对随机行进行分组,直到它们与某个值匹配? +或 -
编辑:查询:
SELECT * FROM (
SELECT d.date, d.pdv, d.coo, SUM(i.itemTotal) total
, SUM(CASE
WHEN f.id > 0 THEN 0
ELSE 1
END) isInvalid
FROM tb_doc d
JOIN tb_docItem i ON i.pdv = d.pdv
AND i.coo = d.coo
AND i.status = 'V'
JOIN map_product p ON p.id = i.productId
LEFT JOIN tmp_family f ON f.id = p.productFamily
WHERE d.date BETWEEN '01-DEZ-2013' AND '31-DEZ-2013'
GROUP BY d.date, d.pdv, d.coo
) WHERE invalid = 0;
答案 0 :(得分:1)
以下查询将返回最多四个元素的所有组,其中sum是给定值:
select *
from table t1 left outer join
table t2
on t2.id > t1.id left outer join
table t3
on t3.id > t2.id left outer join
table t4
on t4.id > t3.id
where (coalesce(t1.value, 0) + coalesce(t2.value, 0) + coalesce(t3.value, 0) +
coalesce(t4.value, 0)
) = 4;
您可以通过将其放入子查询并执行rownum = 1
来选择其中一行。
要获得最接近某个值,请将where
子句替换为:
order by abs(4 - (coalesce(t1.value, 0) + coalesce(t2.value, 0) +
coalesce(t3.value, 0) + coalesce(t4.value, 0)
)
)
要处理任意数量的值,需要递归CTE,可能比解决问题所需的麻烦更多。
针对您的特定问题,只需使用with
查询:
with t as (<your query here>)
并按照上述说明进行操作。