下列数据是一列火车的信息:车序号(每几节车)、发站、装的什么煤、货货人、收货人、列车流水作业编号
分组前:
1 张家口南 平3 A公司 测试 032008101701
2 张家口南 平3 A公司 测试 032008101701
3 张家口南 平3 A公司 测试 032008101701
4 张家口南 大精末 A公司 测试 032008101701
5 张家口南 大精末 A公司 测试 032008101701
6 张家口南 大精末 A公司 测试 032008101701
7 张家口南 大精末 A公司 测试 032008101701
8 张家口南 大精末 A公司 测试 032008101701
9 张家口南 大精末 A公司 测试 032008101701
10 张家口南 大精末 A公司 测试 032008101701分组后:
1-3 张家口南 平3 A公司 测试 032008101701
4-10 张家口南 大精末 A公司 测试 032008101701现在有这种情况:
1 张家口南 平3 A公司 测试 032008101701
2 张家口南 平3 A公司 测试 032008101701
3 张家口南 平3 A公司 测试 032008101701
4 张家口南 大精末 A公司 测试 032008101701
5 张家口南 大精末 A公司 测试 032008101701
6 张家口南 大精末 A公司 测试 032008101701
7 张家口南 平3 A公司 测试 032008101701
8 张家口南 平3 A公司 测试 032008101701
9 张家口南 大精末 A公司 测试 032008101701
10 张家口南 大精末 A公司 测试 032008101701
怎么能使用SQL语句查询出这样的数据
1-3 张家口南 平3 A公司 测试 032008101701
4-6 张家口南 大精末 A公司 测试 032008101701
7-8     张家口南 平3 A公司 测试 032008101701
8-10    张家口南 大精末 A公司 测试 032008101701我现在的SQL语句是这样的,但实现不了对车序号正常的统计
select min(s.ftrainordernum) || '-' || max(s.ftrainordernum) ftrainordernum,  --车序号范围
       stastation.fnamevcr fstatstastionname,                                 --发站名称
       coaltype.fnamevcr fcoalname,                                           --煤种名称
       comegounit1.fnamevcr fconsignername,                                   --发货人名称
       comegounit2.fnamevcr fconsigneename,                                   --收货人名称
       s.ftraincodevcr,                                                       --列车编码
       s.fclientcodenum fclientcode,                                          --入帐人代码
       comegounit3.fnamevcr fclientname                                       --入帐人名称
from t_ci_train_s s--关联发站表
left outer join t_b_stastation stastation on stastation.fcodenum = s.fstatstastioncodenum--关联煤种表
left outer join t_c_coaltype coaltype on coaltype.fcodevcr = s.fcoalcodevcr--关联往来单位表
left outer join t_b_comegounit comegounit1 on comegounit1.fcodenum = s.fconsignernum
left outer join t_b_comegounit comegounit2 on comegounit2.fcodenum = s.fconsigneenum
left outer join t_b_comegounit comegounit3 on comegounit3.fcodenum = s.fclientcodenumgroup by stastation.fnamevcr,
         coaltype.fnamevcr,
         comegounit1.fnamevcr,
         comegounit2.fnamevcr,
         s.ftraincodevcr,
         s.fclientcodenum,
         comegounit3.fnamevcr
order by ftrainordernum

解决方案 »

  1.   

    用一条sql很难,但是可以用pl/sql,方法如下,可以修改成procedure和function:
    DROP TABLE tx3;
    CREATE TABLE tx3(n INT,station VARCHAR2(30),TYPE  VARCHAR2(30),fa VARCHAR2(30),shou  VARCHAR2(30),hao  VARCHAR2(30));
    insert into tx3 values('1','张家口南','平3','A公司','测试','032008101701');
    insert into tx3 values('2','张家口南','平3','A公司','测试','032008101701');
    insert into tx3 values('3','张家口南','平3','A公司','测试','032008101701');
    insert into tx3 values('4','张家口南','大精末','A公司','测试','032008101701');
    insert into tx3 values('5','张家口南','大精末','A公司','测试','032008101701');
    insert into tx3 values('6','张家口南','大精末','A公司','测试','032008101701');
    insert into tx3 values('7','张家口南','平3','A公司','测试','032008101701');
    insert into tx3 values('8','张家口南','平3','A公司','测试','032008101701');
    insert into tx3 values('9','张家口南','大精末','A公司','测试','032008101701');
    insert into tx3 values('10','张家口南','大精末','A公司','测试','032008101701');
    COMMIT;DECLARE
      CURSOR L_C IS
        SELECT * FROM TX3 ORDER BY N;
      L_R1 TX3%ROWTYPE;
      L_R2 TX3%ROWTYPE;
    BEGIN
      FOR I IN L_C LOOP
        IF L_R1.N IS NOT NULL THEN
          L_R2 := L_R1;
        END IF;
        L_R1 := I;
        IF L_R1.STATION = L_R2.STATION AND L_R1.TYPE = L_R2.TYPE AND
           L_R1.FA = L_R2.FA AND L_R1.SHOU = L_R2.SHOU AND L_R1.HAO = L_R2.HAO THEN
          NULL;
        ELSE
          IF L_R2.N IS NOT NULL THEN
            DBMS_OUTPUT.PUT_LINE('-' || L_R2.N || ' ' || L_R2.STATION || ' ' ||
                                 L_R2.TYPE || ' ' || L_R2.FA || ' ' ||
                                 L_R2.SHOU || ' ' || L_R2.HAO);
          END IF;
          IF L_R1.N IS NOT NULL THEN
            DBMS_OUTPUT.PUT(L_R1.N);
          END IF;
        END IF;
      END LOOP;
      IF L_R1.N IS NOT NULL THEN
        DBMS_OUTPUT.PUT_LINE('-' || L_R1.N || ' ' || L_R1.STATION || ' ' ||
                             L_R1.TYPE || ' ' || L_R1.FA || ' ' || L_R1.SHOU || ' ' ||
                             L_R1.HAO);
      END IF;
    END;
    /--输出:
    1-3 张家口南 平3 A公司 测试 032008101701
    4-6 张家口南 大精末 A公司 测试 032008101701
    7-8 张家口南 平3 A公司 测试 032008101701
    9-10 张家口南 大精末 A公司 测试 032008101701
      

  2.   

    其实可以用first_value和last_value这两个分析函数实现,用SQL跑出来
      

  3.   

    -- 连续数问题, TRY IT ..
    SQL> SELECT * FROM TABLE_NAME;FTRAINORDERNUM FNAME    FNAMESTATION FNAMEVCR GNAMEVCR FTRAINCODEVCR
    -------------- -------- ------------ -------- -------- -------------
                 1 ZJK_NEST PING3        ACOMPANY TEST     032008101701
                 2 ZJK_NEST PING3        ACOMPANY TEST     032008101701
                 3 ZJK_NEST PING3        ACOMPANY TEST     032008101701
                 4 ZJK_NEST DAJINGMO     ACOMPANY TEST     032008101701
                 5 ZJK_NEST DAJINGMO     ACOMPANY TEST     032008101701
                 6 ZJK_NEST DAJINGMO     ACOMPANY TEST     032008101701
                 7 ZJK_NEST PING3        ACOMPANY TEST     032008101701
                 8 ZJK_NEST PING3        ACOMPANY TEST     032008101701
                 9 ZJK_NEST DAJINGMO     ACOMPANY TEST     032008101701
                10 ZJK_NEST DAJINGMO     ACOMPANY TEST     03200810170110 rows selectedSQL> SELECT MIN(FTRAINORDERNUM)||'-'||MAX(FTRAINORDERNUM) FTRAINORDERNUM,
      2         FNAME,
      3         FNAMESTATION,
      4         FNAMEVCR,
      5         GNAMEVCR,
      6         FTRAINCODEVCR
      7    FROM (SELECT TT.*,
      8                 FTRAINORDERNUM-ROW_NUMBER() OVER(PARTITION BY FNAME,FNAMEVCR,GNAMEVCR,FTRAINCODEVCR,FNAMESTATION ORDER BY FTRAINORDERNUM) RN
      9            FROM TABLE_NAME TT
     10           )ZZ
     11   GROUP BY FNAME,
     12            FNAMESTATION,
     13            FNAMEVCR,
     14            GNAMEVCR,
     15            FTRAINCODEVCR,
     16            RN
     17   ORDER BY 1;FTRAINORDERNUM       FNAME    FNAMESTATION FNAMEVCR GNAMEVCR FTRAINCODEVCR
    ------------------ ---------- ------------ -------- -------- -------------
    1-3                  ZJK_NEST PING3        ACOMPANY TEST     032008101701
    4-6                  ZJK_NEST DAJINGMO     ACOMPANY TEST     032008101701
    7-8                  ZJK_NEST PING3        ACOMPANY TEST     032008101701
    9-10                 ZJK_NEST DAJINGMO     ACOMPANY TEST     032008101701
      

  4.   

    根据楼主的数据,偷懒得到结果
    SELECT min_n || '-' max_n
      ,station
    ,type
    ,fa
    ,shou
    ,hao
      FROM
      (
    SELECT   station
    ,type
    ,fa
    ,shou
    ,hao
    ,min(n) min_n
    ,max(n) max_n
      FROM tx3
     GROUP BY station, type, fa, shou, hao
       )
      

  5.   

    呵呵,由于昨天外出,没有及时回复。
    可以结贴了,4楼朋友正解,在这谢过~
    还有好多东西要学呀,看了这个ROW_NUMBER() OVER(PARTITION BY有些发蒙,希望4楼的maintisXF朋友能给帮助~