Функция агрегирования TSQL для создания флага да или нет - PullRequest
0 голосов
/ 06 января 2011

Я попытаюсь объяснить мою проблему, используя аналогичную, но более простую проблему.Допустим, я пишу программное обеспечение для библиотеки с таблицей Patron s и Book s.Кроме того, у него есть таблица CheckOuts, которая связывает Patron s с любыми Book s (1 на строку), которые они извлекли.

Я использую MSSQL 2005 и мне нужно создатьпросмотр или хранимая процедура, которая содержит два столбца, PatronID и HasBook, которые должны генерироваться динамически: 1, если у клиента есть одна или несколько книг, и 0 в противном случае.

Вот мой первыйпопытка написать запрос для этого:

SELECT PatronID, MIN((SELECT 1, COUNT(BookID) FROM CheckOuts WHERE CheckOuts.PatronID = Patrons.PatronID)) AS HasBook
            FROM Patrons

Я получаю ошибку:

Невозможно выполнить агрегатную функцию для выражения, содержащего агрегат или подзапрос.

Я очень новый пользователь SQL, поэтому, если этот запрос заставит вас вздрогнуть, я буду искренне признателен за любой совет, который вы хотели бы дать.Я очень заинтересован в «правильном» способе сделать это.

Ответы [ 2 ]

2 голосов
/ 06 января 2011

Что ж, если вы просто хотите узнать, есть ли у PatronId какая-либо проверка, вы можете сделать следующее:

SELECT PatronID, CASE WHEN B.PatronId IS NOT NULL THEN 1 ELSE 0 END AS HasBook
FROM Patrons A
LEFT JOIN (SELECT PatronId FROM CheckOuts GROUP BY PatronId) B
ON A.PatronId = B.PatronId
0 голосов
/ 06 января 2011

Попробуйте это:

SELECT a.PatronID, CASE b.PatronID WHEN NULL THEN 0 ELSE 1 END
FROM Patrons a
LEFT OUTER JOIN Patrons b ON b.PatronID = a.PatronID AND EXISTS (SELECT * FROM CheckOuts c WHERE c.PatronID = b.PatronID)

РЕДАКТИРОВАТЬ: решение Ламака, используя производную таблицу, может быть лучше, чем мое. Его, вероятно, быстрее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...