Case语句中的SQL查询

时间:2011-05-25 09:27:00

标签: sql sql-server sql-server-2005 tsql

我有一个名为tblAccount的表,其中有两列:

  1. DateCreated
  2. AccountApprovalDate
  3. DateCreated是创建帐户的日期,AccountApprovalDate是帐户获批准的日期。

    我需要创建一个名为“AccountApproval / RejectDate”的列。这里拒绝日期是一个派生值。(即)。有一个名为tblDeclinedac​​counts的表,当此表中有accountId时,则选择DateCRetaed列。  此列只能包含批准日期或拒绝日期。 当AccountApprovalDate不为null时,则值相同。当拒绝日期不为null时,我们需要选择Datecreated列。  我写了以下查询:

    SELECT AC.Datecreated, 'Approved/Rejected Date' =
        CASE
            WHEN AC.AccountApprovalDate IS NOT NULL THEN 
                (SELECT AC.AccountApprovalDate)
            WHEN AC.AccountApprovalDate IS NULL THEN 
                (SELECT DA.Datecreated 
                 FROM tblDeclinedAccounts DA 
                 INNER JOIN tblAccount AC ON DA.AccountID = AC.AccountID where DA.AccountID IS NOT NULL)
    
        END
    FROM tblAccount AC
    

    我在执行时遇到错误:

      

    子查询返回的值超过1。当子查询遵循=,!=,<,< =,>,> =或子查询用作表达式时,不允许这样做。

    这需要是一个子查询。

3 个答案:

答案 0 :(得分:3)

为什么需要成为子查询?只需加入并使用COALESCE

SELECT ac.accountid, COALESCE(ac.approvaldate, da.datecreated) as 'Approved/Rejected Date'
FROM tblAccount ac
JOIN tblDeclinedAccounts da
ON da.Accountid = ac.Accountid;

答案 1 :(得分:1)

@veredesmarald已经是正确的了。

这是另一种选择。

SELECT ac.accountid, IsNull(ac.approvaldate, da.datecreated) as 'Approved/Rejected Date'
FROM tblAccount ac
JOIN tblDeclinedAccounts da
ON da.Accountid = ac.Accountid;

答案 2 :(得分:0)

您可以使用MINMAX来确保拒绝日期是唯一的。

SELECT AC.DateCreated
    , COALESCE(R.RejectionDate, AC.AccountApprovalDate) [Approved/Rejected Date]
FROM tblAccount AC
LEFT OUTER JOIN
(
    SELECT AccountID, MIN(DateCreated) RejectionDate
    FROM tblDeclinedAccounts
    GROUP BY DateCreated
) AS R ON R.AccountID = AC.AccountID