急用SQL问题:关于union,group by ,order by(200分)

  • 主题发起人 主题发起人 windflower
  • 开始时间 开始时间
W

windflower

Unregistered / Unconfirmed
GUEST, unregistred user!
我的承付单中主要有这些字段:供应商、进仓单号、本次实际付款金额、应付金额。
进仓单号有两类:SJC和CJC。(SJC表示丝类,CJC表示绸类)
现在要根据供应商分丝和绸两大类来统计本次实际付款金额和应付金额。
统计出来的结果如:
供应商 种类 本次实际付款金额 应付金额
a 丝 50000 10000
a 绸 40000 1000000
b 丝 600000 90000000
b 绸 55555 6666666666
我用
select 供应商,'丝类',sum(本次实际付款金额) as 付款金额,sum(应付金额) as 货款金额
from 承付单表 where 进仓单号 like 'SJC%' group by 供应商 order by 供应商
可以按供应商统计出丝类的实付金额和应付金额;
用select 供应商,'绸类',sum(本次实际付款金额) as 付款金额,sum(应付金额) as 货款金额
from 承付单表 where 进仓单号 like 'CJC%' group by 供应商 order by 供应商
可以按供应商统计出绸类的实付金额和应付金额;
但我把它们连接起来却报错:
(select 供应商,'丝类',sum(本次实际付款金额) as 付款金额,sum(应付金额) as 货款金额
from 承付单表 where 进仓单号 like 'SJC%' group by 供应商 order by 供应商) union
(select 供应商,'绸类',sum(本次实际付款金额) as 付款金额,sum(应付金额) as 货款金额
from 承付单表 where 进仓单号 like 'CJC%' group by 供应商 order by 供应商)
请问该怎样连接并排序?



 
方法一、
(select 供应商,'丝类',sum(本次实际付款金额) as 付款金额,sum(应付金额) as 货款金额
from 承付单表 where 进仓单号 like 'SJC%' group by 供应商 order by 供应商) union all
(select 供应商,'绸类',sum(本次实际付款金额) as 付款金额,sum(应付金额) as 货款金额
from 承付单表 where 进仓单号 like 'CJC%' group by 供应商 order by 供应商)

方法二、
select 供应商,Case when 单号分类='SJC' then '丝类' else '绸类' end,
sum(本次实际付款金额) as 付款金额,sum(应付金额) as 货款金额
from (Select *,SubString(进仓单号,3) As 单号分类 from 承付单表) T
group by 供应商,单号分类 order by 供应商,单号分类
 
(select ltrim(rtrim(送货单位)),'丝类' as 种类,sum(本次实际付款金额) as 付款金额,
sum(应付金额) as 货款金额 from 承付单表 where ((进仓单号 like 'SJC%')
and (送货单位 is not null) and (ltrim(rtrim(送货单位))<>''))
group by ltrim(rtrim(送货单位))) union (select ltrim(rtrim(送货单位)),
'绸类' as 种类,sum(本次实际付款金额) as 付款金额,sum(应付金额) as 货款金额
from 承付单表 where ((进仓单号 like 'CJC%') and (送货单位 is not null)
and (ltrim(rtrim(送货单位))<>'')) group by ltrim(rtrim(送货单位)))
order by ltrim(rtrim(送货单位)),种类 desc
 
用Union连接的Select字句不能有Order by,放到最后就可以了。
 
select * from ( select ... union select ) a order by ...
 
为什么不只用一条语句呢?
如下:
select 供应商,'绸类',sum(本次实际付款金额) as 付款金额,sum(应付金额) as 货款金额
from 承付单表 where (进仓单号 like 'CJC%' or 进仓单号 like 'SJC%')
group by 供应商 ,left(进仓单号,3)

而且如果采用了group by ,返回的记录集中就会按group by 后的字段自动order by 的。
 
多人接受答案了。
 

Similar threads

D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部