SQL 服务器:SELECT B 列中的 A 列
SQL Server : SELECT Column A from Column B
首先,我希望主题标题不要太含糊,我不太确定如何描述这个问题。
我收到了一个库存数据库,该数据库由几代具有不同技能水平的人发展和开发。现在它有很多看似相似但又不完全相同的东西。
因此,虽然有一个 table 可以针对每种类型的库存进行成本调整。它未被使用,而是有人花时间 pre-calculate 每个可能的价格并将其添加到库存的每一行 table:
SELECT Part#, CategoryID, StdCost, ListPrice, Level1, Level2, Level3
FROM [Inventory]
WHERE ...
[Customers]
table 的每一行都有一个 PriceLevel
列,其中包含以下值之一:Level1, Level2, Level3
。但现在我才发现还有另一个 table,为一小部分客户提供额外折扣。找到带有 Left Join
的 E.DiscountLevel
很容易,我正在寻找的帮助是最后一列,这个其他折扣 table 也覆盖客户 PriceLevel
与特定的新折扣类别。我不确定它是否完全可以完成,但是一个 table 中的单元格值是否可以用作相同 SELECT
的另一个 table 中的列名?
Table [Inventory]
有列 Level1, Level2, Level3
,table [InventoryDiscounts]
有列 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
我预计答案会是 'Just use an extra query',没关系。但是你们经常能够施展一些疯狂的魔法,如果是这样的话我会很高兴的。
您可以使用 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
我认为如果你把它拼写成一个案例,那将是最好的表现。简单地 select 基于 E. Pricelevel
的正确列 B
https://docs.microsoft.com/en-us/sql/t-sql/language-elements/case-transact-sql
首先,我希望主题标题不要太含糊,我不太确定如何描述这个问题。
我收到了一个库存数据库,该数据库由几代具有不同技能水平的人发展和开发。现在它有很多看似相似但又不完全相同的东西。
因此,虽然有一个 table 可以针对每种类型的库存进行成本调整。它未被使用,而是有人花时间 pre-calculate 每个可能的价格并将其添加到库存的每一行 table:
SELECT Part#, CategoryID, StdCost, ListPrice, Level1, Level2, Level3
FROM [Inventory]
WHERE ...
[Customers]
table 的每一行都有一个 PriceLevel
列,其中包含以下值之一:Level1, Level2, Level3
。但现在我才发现还有另一个 table,为一小部分客户提供额外折扣。找到带有 Left Join
的 E.DiscountLevel
很容易,我正在寻找的帮助是最后一列,这个其他折扣 table 也覆盖客户 PriceLevel
与特定的新折扣类别。我不确定它是否完全可以完成,但是一个 table 中的单元格值是否可以用作相同 SELECT
的另一个 table 中的列名?
Table [Inventory]
有列 Level1, Level2, Level3
,table [InventoryDiscounts]
有列 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
我预计答案会是 'Just use an extra query',没关系。但是你们经常能够施展一些疯狂的魔法,如果是这样的话我会很高兴的。
您可以使用 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
我认为如果你把它拼写成一个案例,那将是最好的表现。简单地 select 基于 E. Pricelevel
的正确列 Bhttps://docs.microsoft.com/en-us/sql/t-sql/language-elements/case-transact-sql