Sql 在另一列中使用子查询列
我有一个这样的疑问。我想使用Sql 在另一列中使用子查询列,sql,sql-server,Sql,Sql Server,我有一个这样的疑问。我想使用PaidAmount列来计算另一列。可能吗 SELECT B.SubProjectCode, A.StatementBreakDown, A.Description, A.ApplicableInvoices, A.AgreedAmount, A.SettlePercentage, (A.AgreedAmount * (A.SettlePercentage/100)) DueToSettle,
PaidAmount
列来计算另一列。可能吗
SELECT
B.SubProjectCode,
A.StatementBreakDown,
A.Description,
A.ApplicableInvoices,
A.AgreedAmount,
A.SettlePercentage,
(A.AgreedAmount * (A.SettlePercentage/100)) DueToSettle,
(SELECT SUM(C.PaymentAmount) FROM VendorSOAPayments C WHERE C.VendorSOAID = A.VendorSOAID ) PaidAmount,
(DueToSettle - PaidAmount ) BalanceAmt
FROM VendorSOA A
INNER JOIN SubProject B
ON A.SubProjectID = B.SubProjectID
使用公共表表达式(CTE),它不会损害性能
;WITH CTE as
(
SELECT
B.SubProjectCode,
A.StatementBreakDown,
A.Description,
A.ApplicableInvoices,
A.AgreedAmount,
A.SettlePercentage,
(A.AgreedAmount * (A.SettlePercentage/100)) DueToSettle,
(SELECT SUM(C.PaymentAmount) FROM VendorSOAPayments C WHERE C.VendorSOAID = A.VendorSOAID ) PaidAmount,
(DueToSettle - PaidAmount ) BalanceAmt
FROM VendorSOA A
INNER JOIN SubProject B
ON A.SubProjectID = B.SubProjectID
)
SELECT
SubProjectCode,
StatementBreakDown,
Description,
ApplicableInvoices,
AgreedAmount,
SettlePercentage,
DueToSettle,
PaidAmount,
(DueToSettle - PaidAmount ) BalanceAmt
FROM CTE
使用公共表表达式(CTE),它不会损害性能
;WITH CTE as
(
SELECT
B.SubProjectCode,
A.StatementBreakDown,
A.Description,
A.ApplicableInvoices,
A.AgreedAmount,
A.SettlePercentage,
(A.AgreedAmount * (A.SettlePercentage/100)) DueToSettle,
(SELECT SUM(C.PaymentAmount) FROM VendorSOAPayments C WHERE C.VendorSOAID = A.VendorSOAID ) PaidAmount,
(DueToSettle - PaidAmount ) BalanceAmt
FROM VendorSOA A
INNER JOIN SubProject B
ON A.SubProjectID = B.SubProjectID
)
SELECT
SubProjectCode,
StatementBreakDown,
Description,
ApplicableInvoices,
AgreedAmount,
SettlePercentage,
DueToSettle,
PaidAmount,
(DueToSettle - PaidAmount ) BalanceAmt
FROM CTE
试试这个
Select *,(DueToSettle - PaidAmount ) BalanceAmt
from
(SELECT
B.SubProjectCode,
A.StatementBreakDown,
A.Description,
A.ApplicableInvoices,
A.AgreedAmount,
A.SettlePercentage,
(A.AgreedAmount * (A.SettlePercentage/100)) DueToSettle,
(SELECT SUM(C.PaymentAmount) FROM VendorSOAPayments C WHERE C.VendorSOAID = A.VendorSOAID ) PaidAmount
FROM VendorSOA A
INNER JOIN SubProject B
ON A.SubProjectID = B.SubProjectID) as Main
试试这个
Select *,(DueToSettle - PaidAmount ) BalanceAmt
from
(SELECT
B.SubProjectCode,
A.StatementBreakDown,
A.Description,
A.ApplicableInvoices,
A.AgreedAmount,
A.SettlePercentage,
(A.AgreedAmount * (A.SettlePercentage/100)) DueToSettle,
(SELECT SUM(C.PaymentAmount) FROM VendorSOAPayments C WHERE C.VendorSOAID = A.VendorSOAID ) PaidAmount
FROM VendorSOA A
INNER JOIN SubProject B
ON A.SubProjectID = B.SubProjectID) as Main
您可以尝试使用“with”子句创建一个临时表/视图,并使用该表中的列计算另一列
with temp as
(SELECT
B.SubProjectCode,
A.StatementBreakDown,
A.Description,
A.ApplicableInvoices,
A.AgreedAmount,
A.SettlePercentage,
(A.AgreedAmount * (A.SettlePercentage/100)) DueToSettle,
(SELECT SUM(C.PaymentAmount) FROM VendorSOAPayments C WHERE C.VendorSOAID = A.VendorSOAID ) PaidAmount,
FROM VendorSOA A
INNER JOIN SubProject B
ON A.SubProjectID = B.SubProjectID)
select
SubProjectCode,
StatementBreakDown,
Description,
ApplicableInvoices,
AgreedAmount,
SettlePercentage,
DueToSettle,
PaidAmount,
(DueToSettle - PaidAmount ) as BalanceAmt
from temp;
您可以尝试使用“with”子句创建一个临时表/视图,并使用该表中的列计算另一列
with temp as
(SELECT
B.SubProjectCode,
A.StatementBreakDown,
A.Description,
A.ApplicableInvoices,
A.AgreedAmount,
A.SettlePercentage,
(A.AgreedAmount * (A.SettlePercentage/100)) DueToSettle,
(SELECT SUM(C.PaymentAmount) FROM VendorSOAPayments C WHERE C.VendorSOAID = A.VendorSOAID ) PaidAmount,
FROM VendorSOA A
INNER JOIN SubProject B
ON A.SubProjectID = B.SubProjectID)
select
SubProjectCode,
StatementBreakDown,
Description,
ApplicableInvoices,
AgreedAmount,
SettlePercentage,
DueToSettle,
PaidAmount,
(DueToSettle - PaidAmount ) as BalanceAmt
from temp;
您也可以使用
APPLY
交叉应用
的工作方式类似于内部联接,即必须从子查询返回结果,否则将丢弃整行。DueToSettle
值总是有一行,所以在这里使用它是安全的
外部应用
的工作原理类似于左外部联接
,这就是我在第二个查询中从单独的表中选择的内容:
SELECT
B.SubProjectCode,
A.StatementBreakDown,
A.Description,
A.ApplicableInvoices,
A.AgreedAmount,
A.SettlePercentage,
DueToSettle.SettleAmount,
Payments.PaidAmount,
(DueToSettle.SettleAmount - Payments.PaidAmount ) BalanceAmt
FROM VendorSOA A
INNER JOIN SubProject B
ON A.SubProjectID = B.SubProjectID
CROSS APPLY(VALUES(A.AgreedAmount * (A.SettlePercentage/100))) DueToSettle(SettleAmount)
OUTER APPLY
(
SELECT
SUM(C.PaymentAmount)
FROM VendorSOAPayments C
WHERE C.VendorSOAID = A.VendorSOAID
) Payments(PaidAmount);
您也可以使用
APPLY
交叉应用
的工作方式类似于内部联接,即必须从子查询返回结果,否则将丢弃整行。DueToSettle
值总是有一行,所以在这里使用它是安全的
外部应用
的工作原理类似于左外部联接
,这就是我在第二个查询中从单独的表中选择的内容:
SELECT
B.SubProjectCode,
A.StatementBreakDown,
A.Description,
A.ApplicableInvoices,
A.AgreedAmount,
A.SettlePercentage,
DueToSettle.SettleAmount,
Payments.PaidAmount,
(DueToSettle.SettleAmount - Payments.PaidAmount ) BalanceAmt
FROM VendorSOA A
INNER JOIN SubProject B
ON A.SubProjectID = B.SubProjectID
CROSS APPLY(VALUES(A.AgreedAmount * (A.SettlePercentage/100))) DueToSettle(SettleAmount)
OUTER APPLY
(
SELECT
SUM(C.PaymentAmount)
FROM VendorSOAPayments C
WHERE C.VendorSOAID = A.VendorSOAID
) Payments(PaidAmount);
这似乎是我认为最优雅的方式。。谢谢你的主意。这似乎是我认为最优雅的方式。。谢谢你的主意。