我一直在摸不着头脑,却找不到一个优雅的'这样做的方式。我正在使用MS SQL Server 2012.
基本上,我获得了一个包含大量项目的表格(ItemsBySeason)。实际项目的长度可以是11(计划实体)或7(样式)字符。
然后我有另一张表(PriceLists),其中包含商品和价格。同样,这些物品都有价格,物品长度为7到11个字符。
我的问题是,是否有一个函数会读取ItemBySeason中的每个项目,并检查PriceLists表中是否有一个匹配长度为11个字符的价格,如果没有,则使用7个字符的价格项目
例如:
Table: Item By Season
Item: AABBCCD1234
Table: PriceLists
Item: AABBCCD1234
Price: 10
所以在这个例子中,我可以为AABBCCD1234检索10
但是,如果发生以下情况:
Table: Item By Season
Item: AABBCCD8888
AABBCCD8888'不匹配在PriceLists中,但下面存在:
Table: PriceLists
Item: AABBCCD
Price: 12
如何检查7长度是否存在并通过12?
非常感谢任何帮助。我发现的唯一工作就是创建一个每个项目的临时表,这个项目在规划实体级别没有价格,并将所有这些项目带到样式级别,然后附加到PriceLists表格,但这看起来很啰嗦。
谢谢,
迈克尔
答案 0 :(得分:1)
SELECT item_by_season.item
, planning_entity_prices.price A planning_entity_price
, style_prices.price As style_price
, Coalesce(planning_entity_prices.price, style_prices.price) As price
FROM item_by_season
LEFT
JOIN price_lists As planning_entity_prices
ON planning_entity_prices.item = item_by_season.item
AND Len(planning_entity_prices.item) = 11
LEFT
JOIN price_lists As style_prices
ON style_prices.item = item_by_season.item
AND Len(style_prices.item) = 7
;
答案 1 :(得分:0)
这是一种使用相关子查询的方法(或者等效地,它可以使用cross apply
)。如果某些东西与7和11长度字符串匹配,则选择11。
select i.*,
(select top 1 pl.price
from PriceLists pl
where pl.itemid = i.itemid or
left(i.itemid, 7) = pl.itemid
order by len(pl.itemid) desc
) as price
from ItemsBySeason i ;