Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在另一列中使用子查询列_Sql_Sql Server - Fatal编程技术网

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);

这似乎是我认为最优雅的方式。。谢谢你的主意。这似乎是我认为最优雅的方式。。谢谢你的主意。