按条件 查询,这种sql 怎么写

出货单表sm_orders

image.png

收款条件表 payments:

image.png


最终需要的结果(收款条件中有项目按项目收,没项目按正常合同收):image.png

JBadmin 发布于 2019-11-28 08:32 (编辑于 2019-11-28 09:19)
1min目标场景问卷 立即参与
回答问题
悬赏:5 F币 + 添加悬赏
提示:增加悬赏、完善问题、追问等操作,可使您的问题被置顶,并向所有关注者发送通知
共4回答
最佳回答
0
fofantasyLv5初级互助
发布于2019-11-28 08:39(编辑于 2019-11-28 10:13)
SELECT
sm_orders.customerNO,
sm_orders.itemNO,
sm_orders.money,
sm_orders.订单项目号,
payments.项目号,
payments.收款条件,
payments.一次收款比率,
payments.一次收款比率*sm_orders.money AS 第一次收款,
payments.二次收款比率,
payments.二次收款比率*sm_orders.money AS 第二次收款
FROM (SELECT
customerNO,
itemNO,
money,
sm_orders.项目号 AS 订单项目号,
(SELECT payments.项目号 FROM payments WHERE payments.customerNO=sm_orders.customerNO AND payments.项目号=sm_orders.项目号) AS 项目号
FROM
sm_orders
)sm_orders
LEFT JOIN payments ON payments.customerNO=sm_orders.customerNO AND ISNULL(payments.项目号,'')=ISNULL(sm_orders.项目号,'')

如果“项目号”字段在数据库中是NULL的话,需要处理一下,比如sqlserver数据库:

ISNULL(payments.项目号,'')=ISNULL(sm_orders.项目号,'')

ORACLE数据库:

NVL(payments.项目号,'')=NVL(sm_orders.项目号,'')


  • JBadmin JBadmin(提问者) 可能我没有表述清楚 ,,请再帮我看一下
    2019-11-28 09:37 
  • fofantasy fofantasy 回复 JBadmin(提问者) 已更新SQL
    2019-11-28 10:03 
  • fofantasy fofantasy 回复 JBadmin(提问者) 因为不确定sm_orders中的项目号,在payment中是否存在,所以先对“项目号”进行处理。然后再关联查询。
    2019-11-28 10:06 
最佳回答
0
hpmpkkLv3中级互助
发布于2019-11-28 08:39

select * from sm_orders inner join payments on sm_orders.customerNO = payments.customerNO

  • JBadmin JBadmin(提问者) 不行哦
    2019-11-28 09:36 
  • hpmpkk hpmpkk 回复 JBadmin(提问者) 报什么错
    2019-11-28 09:39 
  • JBadmin JBadmin(提问者) 回复 hpmpkk 最终需要的结果(收款条件中有项目按项目收,没项目按正常合同收) 不能满足条件
    2019-11-28 09:46 
最佳回答
0
maoningLv5初级互助
发布于2019-11-28 10:09(编辑于 2019-11-28 10:12)

不知道你那是什么数据库,我的是oracle,有的数据库不支持is null写法,可以换成你那个数据库的为空判断:


select s.customerno,s.itemno,s.money,s.项目号,p.收款条件,p.一次收款比率*100||'%' 一次收款比率,s.money*p.一次收款比率 第一次收款,p.二次收款比率*100||'%' 二次收款比率,s.money*p.二次收款比率 第二次收款

from sm_orders s,PAYMENTS p

where s.customerno=p.customerno

and s.项目号=p.项目号

union all

select s.customerno,s.itemno,s.money,s.项目号,p.收款条件,p.一次收款比率*100||'%' 一次收款比率,s.money*p.一次收款比率 第一次收款,p.二次收款比率*100||'%' 二次收款比率,s.money*p.二次收款比率 第二次收款

from sm_orders s,PAYMENTS p

where s.customerno=p.customerno

and p.项目号 is null

and not exists(

select 1 from PAYMENTS p

where s.项目号=p.项目号

);



最佳回答
0
shinger@126.comLv2见习互助
发布于2019-11-28 10:09

用左关联 

SELECT
sm_orders.customerNO,
sm_orders.itemNO,
sm_orders.money,
sm_orders.项目号,
payments.收款条件,
payments.一次收款比率,
payments.一次收款比率*sm_orders.money AS 第一次收款,
payments.二次收款比率,
payments.第二次收款比率*sm_orders.money AS 第二次收款
FROM (SELECT
customerNO,
itemNO,
money,
isnull(payments.项目号,sm_orders.itemNO) 项目号
FROM
sm_orders
LEFT JOIN payments ON payments.customerNO=sm_orders.customerNO AND payments.项目号=sm_orders.项目号

比如上面输出的项目号字段,意思是在payments表有匹配的数据,用payments表的项目号,没有匹配用左表(sm_orders)的itemNO

  • 6关注人数
  • 594浏览人数
  • 最后回答于:2019-11-28 10:13
    请选择关闭问题的原因
    确定 取消
    返回顶部