2013-04-18 15 views
3

我有這樣一個表如下:將尾行作爲一組行的標題行

rfa_yea | rfa_idx |      rfa_dsp      | rfa_tpr 
---------+---------+----------------------------------------------------+--------- 
2013 |  1 | PIGATO VERM.NO/ROSS/ORMEASCO CL75     | A 
2013 |  2 | ESTATE\134134134047 BICCHIERE SING.VERDE   | A 
2013 |  3 | Rif. Trn. N. 17 del 17/04/2013 Cassa N. 00001  | C 
2013 |  4 | BIB.RED BULL LAT.CL25 ENER.DRI      | A 
2013 |  5 | BIB.RED BULL LAT.CL25 ENER.DRI      | A 
2013 |  6 | SHOPPER 30X60 MAXI X 1000       | A 
2013 |  7 | SHOPPER HD 27X50 MEDIE X 1000      | A 
2013 |  8 | PIGATO VERM.NO/ROSS/ORMEASCO CL75     | A 
2013 |  9 | * SCONTO SUBTOTALE        | A 
2013 |  10 | Rif. Trn. N. 19 del 17/04/2013 Cassa N. 00001  | C 

註明爲'C'領域rfa_tpr的記錄是傳來組行的頭在它之前。我需要到該行地方作爲組行,而不是尾(隔膜)作爲目前的的頭,所以我想要檢索設定像下面這樣的結果:

rfa_yea | rfa_idx |      rfa_dsp      | rfa_tpr 
---------+---------+----------------------------------------------------+--------- 
2013 |  3 | Rif. Trn. N. 17 del 17/04/2013 Cassa N. 00001  | C 
2013 |  1 | PIGATO VERM.NO/ROSS/ORMEASCO CL75     | A 
2013 |  2 | ESTATE\134134134047 BICCHIERE SING.VERDE   | A 
2013 |  10 | Rif. Trn. N. 19 del 17/04/2013 Cassa N. 00001  | C 
2013 |  4 | BIB.RED BULL LAT.CL25 ENER.DRI      | A 
2013 |  5 | BIB.RED BULL LAT.CL25 ENER.DRI      | A 
2013 |  6 | SHOPPER 30X60 MAXI X 1000       | A 
2013 |  7 | SHOPPER HD 27X50 MEDIE X 1000      | A 
2013 |  8 | PIGATO VERM.NO/ROSS/ORMEASCO CL75     | A 
2013 |  9 | * SCONTO SUBTOTALE        | A 

是否有解決方案,只有SQL?該解決方案應該適用於這些類型的數據庫服務器:MSSQL,PostgreSQL和MySQL。

注意

我可以有多個分隔符(頁腳)行,而不是隻有兩個作爲例子......

+1

存在各種解決方案,但它們幾乎都非常糟糕。這一點,以及合理處理行的困難,是SQL令人驚訝的困難之一。 –

+2

你是什麼意思「*之前的行組*」?請記住,SQL表沒有固有的順序。您是否以某種方式推斷數據「之前」和「之後」出現的內容,例如從'rfa_idx'的值?在你的表中維護一個包含某種'group_id'的列是明智的。 – eggyal

+0

@eggyal看看我自己的答案,我找到了解決方案! – aleroot

回答

4
SELECT a.rfa_yea , 
     a.rfa_idx , 
     a.rfa_dsp , 
     a.rfa_tpr 
FROM table1 a 
INNER JOIN table1 c ON a.rfa_idx <= c.rfa_idx AND c.rfa_tpr = 'C' 
GROUP BY a.rfa_yea , 
     a.rfa_idx , 
     a.rfa_dsp , 
     a.rfa_tpr 
ORDER BY MIN(c.rfa_idx), a.rfa_tpr DESC, a.rfa_idx 

SQL Server Demo

MySQL Demo

PostgreSQL Demo

0

我認爲這是一個數據庫設計問題。除了行的順序外,你所說的「行組」也沒有什麼共同之處。

我會建議,如果可能的話,爲這些行組添加一個字段並插入一個公共值。雖然這不是一個方便的解決方案,但我認爲一個數據庫設計應該反映了你希望組織數據的方式。

+0

除了顯而易見的數據庫設計問題,我正在尋找解決方案,因爲它是有趣的謎語...... ;-) – aleroot

+0

從實際的角度來看,拋開技術挑戰,爲什麼要避免最自然的解決方案? – Aeronth

+0

由於好奇心,看看我自己的答案我的問題......無論如何。 – aleroot

2

我找到了一個解決方案通過自己的SQL查詢下面,如果有人將來會需要做同樣的事情:

SELECT * FROM righfatture r 
LEFT JOIN ( 
SELECT r1.rfa_tpr,r1.rfa_idx, COALESCE(r2.rfa_idx, -1) AS IDXP FROM righfatture r1 
LEFT JOIN righfatture r2 ON r2.rfa_idx < r1.rfa_idx AND r2.rfa_tpr = r1.rfa_tpr 
WHERE r1.rfa_tpr = 'C' 
) j ON j.rfa_tpr = r.rfa_tpr AND r.rfa_idx = j.rfa_idx 
ORDER BY CASE WHEN j.rfa_tpr IS NOT NULL THEN j.IDXP ELSE r.rfa_idx END 
+0

這不是真的會起作用。在上面的例子中,你會得到rfa_idx = 10的行,然後是1,2,3 ..到9. http://sqlfiddle.com/#!6/e424b/2。儘管如此,想法很好,在最後一個條件(=而不是>)中的小改動會使它發生 - http://sqlfiddle.com/#!6/e424b/4 –

+0

@NenadZivkovic謝謝。 – aleroot

1

解決方案很容易,問題是問題......假設下,去年應該先和rfa_idx談到後面rfa_yea

解決方案。

select * from table1 order by rfa_yea desc, find_in_set(rfa_tpr, "C,A"), rfa_idx; 

問題是你不應該過度依賴增加id和已經提到的設計問題。

Marco