我有一张如下表格:
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
标记为rfa_tpr
的字段'C'
的记录是其前面的行组的标题。我需要将行作为行组的标题而不是页脚(分隔符)放置,所以我想检索如下结果集:
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。
注意
我可以有多个分隔符(页脚)行,而不仅仅是示例中的两个......
答案 0 :(得分: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 强>
答案 1 :(得分: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
答案 2 :(得分:1)
解决方案很简单,问题就是问题......
解决方案假设去年应该是第一位且rfa_idx落后于rfa_yea。
select * from table1 order by rfa_yea desc, find_in_set(rfa_tpr, "C,A"), rfa_idx;
问题是你不应过分依赖增加的ID和已经提到的设计问题。
马
答案 3 :(得分:0)
我认为这是一个数据库设计问题。你所谈论的“行组”除了行的顺序之外没有任何共同之处。
我建议,如果可能的话,添加一个字段并为这些行组插入一个公共值。虽然这不是一个方便的解决方案,但我认为数据库设计应反映您希望数据组织的方式。