现有一个交易表,内容例如交易编号 客户名 发票号
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是分销商,按交易号排序像这种情况能不能一次过生成一个结果集?
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是分销商,按交易号排序像这种情况能不能一次过生成一个结果集?
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,
客户名,
发票号
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 行)
*/
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
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
还是去联接客户分类表逻辑比较准确
查询大客户 order by 交易编号
unioan all
查询小客户 order by 客户名 发票号
union all
查询分销商 order by 交易编号
union 中间不能order by 吧?!
我回头去试试8楼的方法