如何对随机行进行分组,直到它们与值匹配?

时间:2014-03-27 17:35:18

标签: sql oracle oracle11g

我正在运行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;

1 个答案:

答案 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>)

并按照上述说明进行操作。