См. ниже запрос с использованием T-SQL с SSMS. Есть три таблицы: B, G и L.
B имеет столбец Bname
G имеет 2 столбца Gname, Gross
L имеет 2 столбца Bname, Gname
Столбец Gross представляет собой значения INT в диапазоне от 80 до 100.
Столбцы таблицы L: Bname и Gname будут содержать имена из таблиц B и G в одной строке. Если оба имени находятся в одной строке, я хотел бы СЧИТАТЬ это как один элемент; только если валовой доход в таблице G находится в диапазоне от 80 до 100 для соответствующей строки Gname.
Мой текущий запрос гласит:
SELECT l.bname, (SELECT COUNT(*) FROM g WHERE g.gross BETWEEN 80 AND 90) AS Good
FROM l
INNER JOIN b
ON b.bname=l.bname
INNER JOIN g
ON g.gname=l.gname
GROUP BY l.bname;
Результат почти готов, но он подсчитывает все строки таблицы G:Gname между 80 и 100. Выдача экземпляров в таблице L, где Bname и Gname находятся в одной строке.
Заранее спасибо за поиск.
Я подозреваю, что вы хотите:
SELECT l.bname,
(SELECT COUNT(*)
FROM b INNER JOIN
g
ON g.gname = l.gname
WHERE b.bname = l.bname AND g.gross BETWEEN 80 AND 90
) AS Good
FROM l ;
Внешняя агрегация не требуется, поскольку l.bname
уникальна.
Чаще всего это расчет с использованием условной агрегации:
SELECT l.bname,
SUM(CASE WHEN g.gross BETWEEN 80 AND 90 THEN 1 ELSE 0 END) AS Good
FROM l INNER JOIN
b
ON b.bname = l.bname INNER JOIN
g
ON g.gname = l.gname
GROUP BY l.bname;
Подзапрос не нужен.
Почему вы выполняете боковое соединение в подзапросе и в
FROM
? Ничего послеFROM l
не нужно, если вы используете этот подзапрос.