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

字段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。

笔记

我可以有多个分隔符(页脚)行,而不仅仅是示例中的两个...

4

4 回答 4

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 演示

MySQL 演示

PostgreSQL 演示

于 2013-04-18T08:44:55.063 回答
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
于 2013-04-18T08:48:05.283 回答
1

解决方法很简单,问题就是问题...

假设去年应该排在第一位并且 rfa_idx 排在 rfa_yea 之后的解决方案。

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

问题是你不应该过分依赖增加 id 和已经提到的设计问题。

马可

于 2013-04-18T09:13:23.780 回答
0

我认为这是一个数据库设计问题。您所说的“行组”除了行的顺序之外没有任何共同点。

如果可能,我建议为这些行组添加一个字段并插入一个公共值。虽然这不是一个方便的解决方案,但我认为数据库设计应该反映您希望数据组织的方式。

于 2013-04-18T08:35:53.177 回答