#sql #join #aggregation
#sql #Присоединиться #агрегирование
Вопрос:
Краткий контекст: Я хотел бы показать список всех компаний, за исключением тех, которые относятся к сектору «оборона» или «правительство», и их общую сумму, потраченную на учебные занятия. Должны отображаться только компании, общая сумма которых превышает 1000.
Итак, я написал следующий запрос:
SELECT NAME, ADDRESS, ZIP_CODE, CITY, SUM(FEE-PROMOTION) AS "Total spent on training at REX"
FROM COMPANY INNER JOIN PERSON ON (COMPANY_NUMBER = EMPLOYER) INNER JOIN ENROLLMENT ON (PERSON_ID = STUDENT)
WHERE SECTOR_CODE NOT IN (SELECT CODE
FROM SECTOR
WHERE DESCRIPTION = 'Government' OR DESCRIPTION = 'Defense')
GROUP BY NAME, ADDRESS, ZIP_CODE, CITY
HAVING SUM(FEE-PROMOTION) > 1000
ORDER BY SUM(FEE-PROMOTION) DESC
Теперь, что мне действительно нужно, вместо определения каждого отдельного столбца в таблице COMPANY, я хотел бы показать ВСЕ столбцы таблицы COMPANY с помощью * .
SELECT * (all tables from COMPANY here), SUM(FEE-PROMOTION) AS "Total spent on training at REX"
FROM COMPANY INNER JOIN PERSON ON (COMPANY_NUMBER = EMPLOYER) INNER JOIN ENROLLMENT ON (PERSON_ID = STUDENT)
WHERE SECTOR_CODE NOT IN (SELECT CODE
FROM SECTOR
WHERE DESCRIPTION = 'Government' OR DESCRIPTION = 'Defense')
GROUP BY * (How to fix it here?)
HAVING SUM(FEE-PROMOTION) > 1000
ORDER BY SUM(FEE-PROMOTION) DESC
Я мог бы определить каждый отдельный столбец из COMPANY в SELECT, и это решение выполнит эту работу (как в первом примере), но как я могу сократить запрос, используя «ВЫБРАТЬ * из таблицы COMPANY»?
Комментарии:
1. С помощью этого:
SELECT COMPANY.*
2. Образцы данных и желаемые результаты действительно помогли бы. Какую базу данных вы используете?
Ответ №1:
Ключевая идея заключается в суммировании в подзапросе, чтобы получить общие расходы для компании. Это позволяет удалить агрегацию из внешнего запроса:
select c.*, pe.total_spend
from company c join
sector s
on c.sector_code = s.code left join
(select p.employer, sum(e.fee - e.promotion) as training_spend
from person p join
enrollment e
on p.person_id = e.student
group by p.employer
) pe
on pe.employer = c.company_number
where s.sector not in ('Government', 'Defense') and
pe.total_spend > 1000