表A:
ID 编号 面值 销售价格 销售数量 销售总额
1 YK-001 50 45 2 90
2 YK-002 10 8 1 8 表B:
ID 编号 面值 销售数量 进价
8 YK-001 50 1 40
9 YK-001 50 1 40
10 YK-002 10 1 5表A一条数据可能对应表B多条。现在需要根据表A去表B查询出每个订单的总进价。也就是说编号YK-001的查询出来总进价就是80.YK-002总进价是5.
希望得到的结果集是:
总交易数 总面值 总销售总额 总利润(总销售价格 - 总进价)
2 110 98 13PS:我知道有很多解决方案,比如做个统计表,每天定时或触发统计。或者写个存储过程好解决。
但现在的情况是希望在程序端发送一次SQL查询请求就能完成这样的统计。
不然程序端只能先查询出表A所有的数据,然后再遍历这些数据,再去表B查询,然后再做处理,不是很好的解决方案。不知大家有没有好的办法,望指点。
ID 编号 面值 销售价格 销售数量 销售总额
1 YK-001 50 45 2 90
2 YK-002 10 8 1 8 表B:
ID 编号 面值 销售数量 进价
8 YK-001 50 1 40
9 YK-001 50 1 40
10 YK-002 10 1 5表A一条数据可能对应表B多条。现在需要根据表A去表B查询出每个订单的总进价。也就是说编号YK-001的查询出来总进价就是80.YK-002总进价是5.
希望得到的结果集是:
总交易数 总面值 总销售总额 总利润(总销售价格 - 总进价)
2 110 98 13PS:我知道有很多解决方案,比如做个统计表,每天定时或触发统计。或者写个存储过程好解决。
但现在的情况是希望在程序端发送一次SQL查询请求就能完成这样的统计。
不然程序端只能先查询出表A所有的数据,然后再遍历这些数据,再去表B查询,然后再做处理,不是很好的解决方案。不知大家有没有好的办法,望指点。
select count(*) as 总交易数 ,sum(a.销售总额) as 总销售总额 , sum(a.面值*a.销售数量) as 总面值,sum(a.销售总额)-(select sum(销售数量*进价) from tb) as 总利润 from ta a
from A
select a.编号,sum(a.销售总额) as 总销售总额 , sum(a.面值*a.销售数量) as 总面值 ,max(c.总交易数),max(b.ss)
from (ta a left join (select 编号,sum(销售数量*进价) as ss from tb group by 编号) b
on a.编号=b.编号)
left join
(select 编号,count(*) as 总交易数 from (select distinct 编号 from tb ) group by 编号) c
on a.编号=c.编号
group by a.编号
这里存在拆单的情况,也就是说表A一条数据(一个订单)对应表B多条数据(多个供货商提供,每个进价可能不一样,且销售数量不一样)。
如果我要查询表A 2012-05-01到2012-08-08的数据,然后再去表B根据编号取总进价,因为可能存在多个供货商,且进价和销售数量不一样,所以卡在这里了:(
from (ta a left join (select 编号,sum(销售数量*进价) as ss from tb group by 编号) b
on a.编号=b.编号)
left join
(select 编号,count(*) as 总交易数 from (select distinct 编号 from tb ) d group by 编号) c
on a.编号=c.编号
group by a.编号 此处需要别名,谢谢@wwwwb 斑竹 鼎力相助,解我燃眉之急,这样的写法学习了:)希望也能帮助到其他有这样特殊需求的朋友:)
from (ta a left join (select 编号,sum(销售数量*进价) as ss from tb group by 编号) b
on a.编号=b.编号)
where a.时间 = '时间' and a.用户 = '用户'
group by a.编号 在@wwwwb 斑竹的基础上我的调整基本就这样,因为表A一条数据就是一笔交易,不必去统计表B每个单子下的所有供货商,所以我去掉了left join c。