SQL — подсчет строк на основе совпадающих столбцов и диапазона значений

См. ниже запрос с использованием 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 находятся в одной строке.

Заранее спасибо за поиск.

Почему вы выполняете боковое соединение в подзапросе и в FROM? Ничего после FROM l не нужно, если вы используете этот подзапрос.

Thom A 15.12.2020 13:24
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
1
859
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я подозреваю, что вы хотите:

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;

Подзапрос не нужен.

Другие вопросы по теме