SQL-запросы в выражении Case

63
8

У меня есть таблица с именем tblAccount, где у меня есть два столбца:


    DateCreated
    AccountApprovalDate

DateCreated - это дата создания учетной записи, а AccountApprovalDate - дата одобрения учетной записи.


Мне нужно создать столбец с именем AccountApproval/RejectDate. Здесь Дата отклонения является производным значением. (I.e). Существует таблица с именем tblDeclinedaccounts. Когда в этой таблице есть accountId, выберите столбец DateCRetaed.
 Эта колонка может иметь только дату утверждения или дату отклонения.
Если AccountApprovalDate не равно 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 значения. Это недопустимо, когда подзапрос следует =,! =, <, < =, > , >= или когда подзапрос используется как выражение.



Это должен быть подзапрос.

спросил(а) 2021-01-25T14:28:27+03:00 5 месяцев назад
1
Решение
90

Почему он должен быть подзапросом? Просто присоединитесь и используйте COALESCE:

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

ответил(а) 2021-01-25T14:28:27+03:00 5 месяцев назад
64

@veredesmarald уже прав.


Вот альтернатива.

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

ответил(а) 2021-01-25T14:28:27+03:00 5 месяцев назад
45

Вы можете использовать MIN или MAX, чтобы гарантировать, что дата отклонения уникальна.


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

ответил(а) 2021-01-25T14:28:27+03:00 5 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема