2014-03-27 17 views
0

我運行的Oracle 11g查詢,返回結果這樣的:如何將隨機行分組,直到它們匹配一個值?

|ID| VALUE| 
|01|  2| 
|02|  1| 
|03|  5| 
|04|  1| 
|05|  4| 
|06|  2| 

所以當我索要「ID的組,它的總和4」我收到:

|01|  2| 
|06|  2| 

OR

|01|  2| 
|02|  1| 
|04|  1| 

我不在乎哪個組是它,它只需要精確的SUM。

紅利問題:如何將隨機行分組,直到它們匹配CLOSE值爲止? +或 -

編輯:查詢:

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

向我們顯示您的查詢,所以我們知道您獲得該結果的方式。 – user2989408

+0

這是一個複雜的查詢,我不認爲它真的很重要。但我會在幾分鐘後發佈。 – GxFlint

+0

所以你真的想要查詢返回的行的組合,顯示'總數'的總和是4的'日期,pdv,coo'?你真的想要4還是隻是一個例子,目標可能會改變?大概多少行你期望從該查詢? –

回答

1

下面的查詢將返回多達四個元素的所有組,其中總和爲給定值:

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

,並按照上述指示。

+0

這就是我正在看的東西,直到我看到底層查詢,並質疑目標是否確實是4.它比我想象的更糟,因爲值甚至不是整數。 –

+0

我試圖讓它變得簡單易懂,但事實並非如此。 – GxFlint

+0

@GustavoFSx。 。 。爲此,SQL方法可能比程序代碼更容易。但是,SQL必須產生各種可能的組合,然後從那裏開始工作。 –

相關問題