首先,我希望主题标题不是太模糊,我不确定如何描述这个问题。
我已经获得了一个由不同技能水平的几代人种植和开发的库存数据库。现在它有大量的东西看起来很相似,但并不完全。
因此,虽然有一个表格可以针对每种类型的库存进行成本调整。它是未使用的,而是有人花时间预先计算每个可能的价格并将其添加到库存表的每一行:
SELECT Part#, CategoryID, StdCost, ListPrice, Level1, Level2, Level3
FROM [Inventory]
WHERE ...
[Customers]
表的每一行都有一个PriceLevel
列,其中包含以下值之一:Level1, Level2, Level3
。但是现在我发现还有另一张表,对于一小部分客户来说可以获得额外的折扣。使用E.DiscountLevel
查找Left Join
很容易,我要查找的帮助是最后一列,此其他折扣表也会覆盖客户PriceLevel
,其中包含特定类别的新客户。我不确定它是否可以完成,但是一个表中的单元格值是否可以用作同一SELECT
的另一个表中的列名?
表格[Inventory]
包含Level1, Level2, Level3
列,表格[InventoryDiscounts]
包含 Word PriceLevel
列Level1
。我应该只使用第二个查询,还是以某种方式SELECT B.(E.Column)
这是包含许多连接的整个查询。在评论区块中没有大胆,但是您可以看到问题点周围的星星。
SELECT
A.InventoryID, B.Description, D.Category,
B.ListPrice, B.Level3 AS Price,
E.DiscountLevel, **B.(E.PriceLevel) AS AltPrice**
FROM
[BranchInventory] A
INNER JOIN
[Inventory] B ON A.InventoryID = B.InventoryID
INNER JOIN
[Branches] C ON A.BranchID = C.BranchID
INNER JOIN
[Categories] D ON B.CategoryID = D.CategoryID
LEFT JOIN
[InventoryDiscounts] E ON E.CustomerID = 32 AND B.CategoryID = E.CategoryID
WHERE
A.BranchID = 8
AND A.InventoryID = 1181691
我希望答案是'只需使用额外的查询',这没关系。但是你们经常会有一些疯狂的魔法,如果是这样的话,我会很喜欢它。
答案 0 :(得分:3)
您可以使用CASE
轻松完成此操作:
SELECT A.InventoryID
,B.Description
,D.Category
,B.ListPrice
,B.Level3 AS Price
,E.DiscountLevel
,CASE
WHEN E.PriceLevel = 'Level1'
THEN B.Level1
WHEN E.PriceLevel = 'Level2'
THEN B.Level2
WHEN E.PriceLevel = 'Level3'
THEN B.Level3
END AS AltPrice
FROM [BranchInventory] A
INNER JOIN [Inventory] B ON A.InventoryID = B.InventoryID
INNER JOIN [Branches] C ON A.BranchID = C.BranchID
INNER JOIN [Categories] D ON B.CategoryID = D.CategoryID
LEFT JOIN [InventoryDiscounts] E ON E.CustomerID = 32
AND B.CategoryID = E.CategoryID
WHERE A.BranchID = 8
AND A.InventoryID = 1181691
答案 1 :(得分:-1)
如果你把它作为一个案例拼写出来,我认为会有最好的表现。只需根据E. Pricelevel
选择正确的B列https://docs.microsoft.com/en-us/sql/t-sql/language-elements/case-transact-sql