现有一个交易表,内容例如交易编号    客户名    发票号
CUS-01     A           
CUS-02     B       01826
CUS-03     B       01827
CUS-04     B       01816
CUS-05     C       00062
CUS-06     C       00054
CUS-07     C       00056
CUS-08     D       
CUS-09     E            输出的结果需要的排序:A必须在最上面,因为A是大客户,在另一表里有记录专门的纪录,如果有多个大客户,则这几个大客户按交易编号排序;BCD是普通客户,排序是先按客户名,同一客户名下按发票号排序,DE是分销商,按交易号排序像这种情况能不能一次过生成一个结果集?

解决方案 »

  1.   

    在排序条件中用上几个 case when 语句应该可以。
      

  2.   

    SELECT * FROM 交易表
    ORDER BY 
         CASE WHEN 客户名 IN (SELECT 客户名 FROM 客户类型表 WHERE Type='大客户')
                    THEN 1 
              WHEN 客户名 IN (SELECT 客户名 FROM 客户类型表 WHERE Type='普通客户')
                    THEN 2
              WHEN  客户名 IN (SELECT 客户名 FROM 客户类型表 WHERE Type='分销商')
                    THEN 3
        END,
        客户名,
        发票号
      

  3.   

    DECLARE @a table(交易编号 varchar(20),    客户名 varchar(2),    发票号 varchar(20))
    INSERT @a SELECT 'CUS-01','A',null          
    union all select 'CUS-02','B',      '01826' 
    union all select 'CUS-03','B',      '01827' 
    union all select 'CUS-04','B',      '01816' 
    union all select 'CUS-05','C',      '00062' 
    union all select 'CUS-06','C',      '00054' 
    union all select 'CUS-07','C',      '00056' 
    union all select 'CUS-08','D',      null
    union all select 'CUS-09','E',      null  SELECT * FROM @a ORDER BY CASE WHEN 客户名='A' then 0 when 客户名 in('b','c') 
    then 1 else 2 end, CASE WHEN 客户名 in('A','D','E') then 交易编号 when 客户名 in('b','c') 
    then 发票号  END

    --result
    /*
    交易编号                 客户名  发票号                  
    -------------------- ---- -------------------- 
    CUS-01               A    NULL
    CUS-06               C    00054
    CUS-07               C    00056
    CUS-05               C    00062
    CUS-04               B    01816
    CUS-02               B    01826
    CUS-03               B    01827
    CUS-08               D    NULL
    CUS-09               E    NULL(所影响的行数为 9 行)
    */
      

  4.   

    DECLARE @t TABLE(n VARCHAR(10),p VARCHAR,v VARCHAR(10))
    INSERT @t SELECT 'CUS-01',    'A',''         
    UNION ALL SELECT 'CUS-02' ,   'B',      '01826'
    UNION ALL SELECT 'CUS-03'  ,  'B' ,     '01827'
    UNION ALL SELECT 'CUS-04'   , 'B'  ,    '01816'
    UNION ALL SELECT 'CUS-05'    ,'C'   ,   '00062'
    UNION ALL SELECT 'CUS-06',    'C'    ,  '00054'
    UNION ALL SELECT 'CUS-07' ,   'C'     , '00056'
    UNION ALL SELECT 'CUS-08'  ,  'D',''     
    UNION ALL SELECT 'CUS-09'   , 'E',''     DECLARE @x TABLE(p VARCHAR,t TINYINT) --客户类型
    INSERT @x SELECT 'A',0 --大客户
    UNION ALL SELECT 'B',1 --普通客户
    UNION ALL SELECT 'c',1
    UNION ALL SELECT 'd',1
    UNION ALL SELECT 'e',2 --分销商SELECT a.* FROM @t a
    LEFT JOIN @x b
    ON a.p=b.p
    ORDER BY CASE WHEN t=0 THEN 0 ELSE 1 END,
    p,
    CASE WHEN t=1 THEN n ELSE v END
      

  5.   

    DECLARE @a table(交易编号 varchar(20),    客户名 varchar(2),    发票号 varchar(20))
    INSERT @a SELECT 'CUS-01','A',null          
    union all select 'CUS-02','B',      '01826' 
    union all select 'CUS-03','B',      '01827' 
    union all select 'CUS-04','B',      '01816' 
    union all select 'CUS-05','C',      '00062' 
    union all select 'CUS-06','C',      '00054' 
    union all select 'CUS-07','C',      '00056' 
    union all select 'CUS-08','D',      null
    union all select 'CUS-09','E',      null  
    ---------------------------------------
    select * from (
    select *,1 ii from @a a where 发票号 is null and not exists(select 0 from @a b where 发票号 is not null and a.交易编号>b.交易编号)
    union all select *,2 from @a a where 发票号 is not null 
    union all select *,3 from @a a where 发票号 is null and exists(select 0 from @a b where 发票号 is not null and a.交易编号>b.交易编号)
    )A order by ii,(case when ii=2 then 客户名 else 交易编号 end),(case when ii=2 then 发票号 else '0' end)
    ------------------------------
    CUS-01 A NULL 1
    CUS-04 B 01816 2
    CUS-02 B 01826 2
    CUS-03 B 01827 2
    CUS-06 C 00054 2
    CUS-07 C 00056 2
    CUS-05 C 00062 2
    CUS-08 D NULL 3
    CUS-09 E NULL 3
    还是去联接客户分类表逻辑比较准确
      

  6.   

    我觉得分开来查询排序速度快点.
    查询大客户 order by 交易编号
    unioan all
    查询小客户 order by 客户名    发票号 
    union all
    查询分销商 order by 交易编号
      

  7.   


    union 中间不能order by 吧?!
    我回头去试试8楼的方法
      

  8.   

    不用ORDER BY 好象就可以吧》
      

  9.   

    8楼的方法在公司试验了一下,在实际的表里会出现 “将 nvarchar 值 '马士基' 转换为数据类型为 int 的列时发生语法错误。”  但8楼的那段抄到查询分析器里运行没有问题啊
      

  10.   

    說明妳數據理由非數值字符,用isnumeric(col)=1過濾
      

  11.   

    出错点是定在 (case when ii=2 then 客户名 else 交易编号 end),(case when ii=2 then 发票号 else '0' end) 这段里,但是8楼那里类型也没有int啊