SQL 服务器中 2 个别名的总和
SUM of 2 aliases in SQL Server
Balance
列显示当前库存 + 未结采购订单减去输入的数量。
我在 SELECT
语句中有一个带有别名的现有查询:
SELECT dbo.Items.ItemNo,
dbo.Items.Name,
dbo.Vendors.Name AS VendorName,
ISNULL(ItemsStock.StockOnHand, 0) AS [Stock on Hand],
ISNULL(PO.[Open PO's'], 0) AS [Open PO],
ISNULL(WO.OpenWOQTY, 0) AS [QTY Entered].
如何添加名为 Balance
的附加列来计算手头库存和未结采购订单的总和,然后扣除输入的数量?
SELECT dbo.Items.ItemNo,
dbo.Items.Name,
dbo.Vendors.Name AS VendorName,
ISNULL(ItemsStock.StockOnHand, 0) AS [Stock on Hand],
ISNULL(PO.[Open PO's'], 0) AS [Open PO],
ISNULL(WO.OpenWOQTY, 0) AS [QTY Entered],
ISNULL(ItemsStock.StockOnHand, 0) + ISNULL(PO.[Open PO's'], 0) - ISNULL(WO.OpenWOQTY, 0) AS [Balance]
FROM table
三点建议:
- 使用 table 个别名。
- 使用
coalesce()
而不是 isnull()
。 coalesce()
是 ANSI 标准。
- 使用不需要转义的列名。
这看起来像:
SELECT i.ItemNo, i.Name, v.Name AS VendorName,
COALESCE(is.StockOnHand, 0) AS Stock_on_Hand,
COALESCE(PO.[Open PO's'], 0) AS Open_PO,
COALESCE(WO.OpenWOQTY, 0) AS QTY_Entered,
(COALESCE(is.StockOnHand, 0) + COALESCE(PO.[Open PO's'], 0) - COALESCE(WO.OpenWOQTY, 0) as Balance
FROM dbo.Items i JOIN
dbo.Vendors v
. . .
如果不想重复别名,传统的方法是使用 CTE 或子查询。 SQL 服务器还提供横向连接,通过 apply
关键字引入:
SELECT i.ItemNo, i.Name, v.Name AS VendorName,
vals.Stock_on_Hand, vals.Open_PO, vals.QTY_Entered,
(vals.Stock_on_Hand + vals.Open_PO - vals.QTY_Entered) as Balance
FROM dbo.Items i JOIN
dbo.Vendors v
. . . CROSS APPLY
(VALUES ( COALESCE(is.StockOnHand, 0), COALESCE(PO.[Open PO's'], COALESCE(WO.OpenWOQTY, 0))
) vals(Stock_on_Hand, Open_PO, QTY_Entered);
Balance
列显示当前库存 + 未结采购订单减去输入的数量。
我在 SELECT
语句中有一个带有别名的现有查询:
SELECT dbo.Items.ItemNo,
dbo.Items.Name,
dbo.Vendors.Name AS VendorName,
ISNULL(ItemsStock.StockOnHand, 0) AS [Stock on Hand],
ISNULL(PO.[Open PO's'], 0) AS [Open PO],
ISNULL(WO.OpenWOQTY, 0) AS [QTY Entered].
如何添加名为 Balance
的附加列来计算手头库存和未结采购订单的总和,然后扣除输入的数量?
SELECT dbo.Items.ItemNo,
dbo.Items.Name,
dbo.Vendors.Name AS VendorName,
ISNULL(ItemsStock.StockOnHand, 0) AS [Stock on Hand],
ISNULL(PO.[Open PO's'], 0) AS [Open PO],
ISNULL(WO.OpenWOQTY, 0) AS [QTY Entered],
ISNULL(ItemsStock.StockOnHand, 0) + ISNULL(PO.[Open PO's'], 0) - ISNULL(WO.OpenWOQTY, 0) AS [Balance]
FROM table
三点建议:
- 使用 table 个别名。
- 使用
coalesce()
而不是isnull()
。coalesce()
是 ANSI 标准。 - 使用不需要转义的列名。
这看起来像:
SELECT i.ItemNo, i.Name, v.Name AS VendorName,
COALESCE(is.StockOnHand, 0) AS Stock_on_Hand,
COALESCE(PO.[Open PO's'], 0) AS Open_PO,
COALESCE(WO.OpenWOQTY, 0) AS QTY_Entered,
(COALESCE(is.StockOnHand, 0) + COALESCE(PO.[Open PO's'], 0) - COALESCE(WO.OpenWOQTY, 0) as Balance
FROM dbo.Items i JOIN
dbo.Vendors v
. . .
如果不想重复别名,传统的方法是使用 CTE 或子查询。 SQL 服务器还提供横向连接,通过 apply
关键字引入:
SELECT i.ItemNo, i.Name, v.Name AS VendorName,
vals.Stock_on_Hand, vals.Open_PO, vals.QTY_Entered,
(vals.Stock_on_Hand + vals.Open_PO - vals.QTY_Entered) as Balance
FROM dbo.Items i JOIN
dbo.Vendors v
. . . CROSS APPLY
(VALUES ( COALESCE(is.StockOnHand, 0), COALESCE(PO.[Open PO's'], COALESCE(WO.OpenWOQTY, 0))
) vals(Stock_on_Hand, Open_PO, QTY_Entered);