关于一个连接查询的问题求助

yxy042408 2017-02-15 09:51:27
我有这样一个需求,
表一:
产品id 产品基准价格 定价单号 数量区间起 数量区间止
1 200 101 0 0 --代表数量区间为(0至无穷大)
2 300 102 0 50
3 250 103 50 0 --代表数量区间为(50至无穷大)

表二:
产品id 产品价格 定价单号 数量
1 150 104 50
1 133.33 105 70
2 280 106 25
2 260.88 110 30
3 220 120 80
3 210.99 130 100

结果
产品id 产品基准价格 定价单号 数量区间起 数量区间止
1 133.33 105 0 0
2 260.88 110 0 50
3 21099 130 50 0
以表一为基准,
在表二中定价单号大于表一中的定价单号的最大单号对应的数量如果在数量区间内,
则把产品价格和定价单号代替基准价格和定价单号查询出来,否则还是原来的价格和单号,
请各位大神指点迷津,非常感谢。
...全文
138 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
就用 1楼那种case when 就可以了
xxfvba 2017-02-16
  • 打赏
  • 举报
回复
;with T1 (id,产品基准价格,定价单号,数量区间起,数量区间止) as ( select 1,200,101,0,0 union all SELECT 2,300,102,0,50 union all SELECT 3,250,103,50,0 ),T2(id,产品价格,定价单号,数量)AS( select 1,150,104,50 union all select 1,133.33,105,70 union all SELECT 2,280,106,25 union all SELECT 2,260.88,110,30 union all select 3,220,120,80 union all select 3,210.99,130,100 ) select id,产品基准价格=case when 产品价格 is null then 产品基准价格 else 产品价格 end, 定价单号=case when 单号 is null then 定价单号 else 单号 end,数量区间起,数量区间止 from (select * from T1 outer apply (select top 1 产品价格, 定价单号 as 单号 from T2 where T2.id=T1.id and T2.定价单号>T1.定价单号 and T2.数量>=T1.数量区间起 and (T1.数量区间止=0 or T2.数量<=T1.数量区间止) order by 定价单号 desc) T) a
二月十六 版主 2017-02-15
  • 打赏
  • 举报
回复
写的麻烦了点,明天看看有啥更好的方法不。
--测试数据
with 表1 (产品id,产品基准价格,定价单号,数量区间起,数量区间止)
as
(
select 1,200,101,0,0 union all
SELECT 2,300,102,0,50 union all
SELECT 3,250,103,50,0
),表2(产品id,产品价格,定价单号,数量)AS(
select 1,150,104,50 union all
select 1,133.33,105,70 union all
SELECT 2,280,106,25 union all
SELECT 2,260.88,110,30 union all
select 3,220,120,80 union all
select 3,210.99,130,100
)
--测试数据结束
,temp1 AS (
SELECT 表2.产品id ,
MAX(表2.定价单号) AS 定价单号
FROM 表2
GROUP BY 表2.产品id
)
SELECT 表1.产品id ,
( CASE WHEN ( SELECT 表2.数量
FROM 表2
WHERE temp1.定价单号 = 表2.定价单号
AND temp1.产品id = 表2.产品id
) > 表1.数量区间起
AND ( 表1.数量区间止 = 0
OR ( SELECT 表2.数量
FROM 表2
WHERE temp1.定价单号 = 表2.定价单号
AND temp1.产品id = 表2.产品id
) < 表1.数量区间止
) THEN ( SELECT 表2.产品价格
FROM 表2
WHERE temp1.定价单号 = 表2.定价单号
AND temp1.产品id = 表2.产品id
)
ELSE 表1.产品基准价格
END ) AS 产品基准价格 ,
( CASE WHEN ( SELECT 表2.数量
FROM 表2
WHERE temp1.定价单号 = 表2.定价单号
AND temp1.产品id = 表2.产品id
) > 表1.数量区间起
AND ( 表1.数量区间止 = 0
OR ( SELECT 表2.数量
FROM 表2
WHERE temp1.定价单号 = 表2.定价单号
AND temp1.产品id = 表2.产品id
) < 表1.数量区间止
) THEN ( SELECT 表2.定价单号
FROM 表2
WHERE temp1.定价单号 = 表2.定价单号
AND temp1.产品id = 表2.产品id
)
ELSE 表1.定价单号
END ) AS 定价单号 ,
表1.数量区间起 ,
表1.数量区间止
FROM 表1
INNER JOIN temp1 ON temp1.产品id = 表1.产品id;


结果:






34,873

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧