SQL Server:从列B中选择列A.

问题描述 投票:-1回答:2

首先,我希望主题标题不是太模糊,我不确定如何描述这个问题。

我被交给了一个由不同技能水平的几代人种植和开发的库存数据库。现在它有大量的东西看起来很相似,但并不完全。

因此,虽然有一个表格可以针对每种类型的库存进行成本调整。它是未使用的,而是有人花时间预先计算每个可能的价格并将其添加到库存表的每一行:

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]有一个列PriceLevel包含Word 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

我希望答案是'只需使用额外的查询',这没关系。但是你们经常会有一些疯狂的魔法,如果是这样的话,我会很喜欢它。

sql sql-server tsql matching multi-table
2个回答
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
投票

我认为如果你把它作为一个案例拼写出来,那将是最好的表现。只需根据E. Pricelevel选择正确的B列

https://docs.microsoft.com/en-us/sql/t-sql/language-elements/case-transact-sql

© www.soinside.com 2019 - 2024. All rights reserved.